0
votes

In my aplication I need photo upload. I want that User first creates album folder and after cliking on that album, uploads photos. My album has: ID, album_name, username and my photo:ID, album_ID, photo_name, type

album controller:

 import java.io.File
import grails.plugin.springsecurity.annotation.Secured
import java.text.SimpleDateFormat

@Secured(['ROLE_USER','ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])

class AlbumController {

    def springSecurityService

    def index() { }

    def create(){
        def user = User.get(springSecurityService.currentUser.id)

        def album = new Album()
        album.a_name = params.name
        album.user = user
        album.save(failOnError:true)

        def photo = new Photo()
        def uploadedFile = request.getFile('myFile')
        def name = System.currentTimeMillis()

        if (uploadedFile.empty) {
            flash.message = 'file cannot be empty'
            redirect (action:'index')
            return
        }

        photo.type = uploadedFile.contentType
        photo.p_name = name
        photo.album = album

        uploadedFile.transferTo(new File("../test101111/web-app/album/" + user.username + "/"+ photo.getP_name() + ".jpg"))
        //response.sendError(200, 'Done')

        photo.save(failOnError:true)
        redirect (action:'index')

    }

}

Photo controller:

import java.io.File
import grails.plugin.springsecurity.annotation.Secured
import java.text.SimpleDateFormat

@Secured(['ROLE_USER','ROLE_ADMIN', 'IS_AUTHENTICATED_FULLY'])

class PhotoController {
    def springSecurityService

    def index() { }
    def create(){
        def photo = new Photo()
        def uploadedFile = request.getFile('myFile')
        def name = System.currentTimeMillis()

        if (uploadedFile.empty) {
            flash.message = 'file cannot be empty'
            redirect (action:'index')
            return
        }
        photo.type = uploadedFile.contentType
        photo.p_name = name
        photo.album = params.albumId
        uploadedFile.transferTo(new File("../test101111/web-app/album/" + photo.getP_name() + ".jpg"))
        //response.sendError(200, 'Done')
        photo.save(failOnError:true)
        redirect (action:'index')
    }
}

Photo view:

<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="layout" content="main" />
<title>Photo</title>
<script
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(document).ready(function() {
        $("span.button").click(function() {
            $("form.forma_album").toggle();
        });
    });
</script>

</head>
<body>
    <div class="body">
        <div class="album_title">
            <span class="title1">Fotografije</span>
            <div class="new_album">
                <img class="plus" src="${resource(dir: 'images', file: 'plus.png')}" />
                <span class="button">Dodaj novu sliku</span>
            </div>
        </div>
        <hr class="usual">
        <g:uploadForm action="create" class="forma_album">
            <input type="file" name="myFile" />
            <input type="submit" />
        </g:uploadForm>
    </div>
</body>
</html>

Album view:

<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="layout" content="main" />
<title>Album</title>
<script
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(document).ready(function() {
        $("span.button").click(function() {
            $("form.forma_album").toggle();
        });
    });
</script>
</head>
<body>
    <div class="body">

        <div class="album_title">
            <span class="title1">Foto albumi</span>
            <div class="new_album">
                <img class="plus" src="${resource(dir: 'images', file: 'plus.png')}" />
                <span class="button">Kreiraj novi album</span>
            </div>
        </div>
        <hr class="usual">
        <g:form action="create" class="forma_album">
            <g:textArea class="album_name" name="name" placeholder="Ime albuma"></g:textArea>
            <g:submitButton class="submit2" name="Dodaj" />
        </g:form>
        <g:each in="${albums}" var="album">
            <g:link controller="photo" action="index" class="contact"
                params="[albumId: album.id]">
                ${album.a_name}
            </g:link>
        </g:each>
        <%--<g:uploadForm action="create" class="forma_album">
<g:textArea class="album_name" name="name" placeholder="Ime albuma"></g:textArea>
<input type="file" name="myFile" />
<input type="submit" />
</g:uploadForm>

--%>
        <div>
            <%--<g:each in="${albums}" var="album" class="picture">
<div class="picture">
<img src="${resource(dir: 'images', file: 'picture.png')}" />
<div class="album_name">
${album.a_name}
</div>
</div>
</g:each>
--%>
        </div>
    </div>


</body>
</html>

My Error is: No signature of method: org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper.getFile() is applicable for argument types: (java.lang.String) values: [myFile] Possible solutions: getXML(), getPart(java.lang.String), getAt(java.lang.String), getAt(java.lang.String), getLocale(), getJSON()

What is wrong? sorry for my English and thanks for the answer ;)

2
Unrelated to your question but I wanted to point def user = User.get(springSecurityService.currentUser.id) is redundant. springSecurityService.currentUser loads the User instance from the database using the id stored in the security principal, and you are then doing another query to load the same instance. Luckily Hibernate caches the first get() call and returns the same instance, but you could change the code to just def user = springSecurityService.currentUser - Burt Beckwith
Also, why are you saving an Album when the file could be empty (once you get past your current problem)? There's no transaction active and no rollback, so that save() will store extra Album instances. - Burt Beckwith

2 Answers

0
votes

You can either set grails.servlet.version = "2.5" in your BuildConfig.groovy or in application.properties

or

use the request.getPart(String) instead of request.getFile(String)

see JavaDoc on Part interface

0
votes

Could you please print the params and paste them here. Alternatively you can try with request.getInputStream().