简体   繁体   中英

Multiple file upload in playframework

I'm having some problems with getting multiple file upload to work. When I select x files, it goes through successfully, but the first file is being uploaded x times, and the others are not being uploaded at all. Anyone able to point out what I am doing wrong?

Form:

#{form @Projects.uploadPictures(project.id), enctype:'multipart/form-data'}   

<p>
    <label>&{'title'}</label>
    <input type="text" name="title"/>
    <strong>(&{'addPicture.chooseTitle'})</strong>
</p>
<p>
    <label>&{'Pictures'}</label>
    <input type="file" multiple name="files" id="files"/>
</p>
<p>
    <input type="submit" value="&{'publish'}" />
</p>

#{/form}

Handling the files:

public static void uploadPictures(long id, String title, List<Blob> files) {
    String error = "";        
    if(files != null && !title.trim().equals("")) {
        Project project = Project.findById(id);
        // Save uploaded files
        Picture picture;

        for(int i = 0; i<files.size(); i++) {
            if(files.get(i) != null) {
                System.out.println("i: "+i+"\nFiltype: "+files.get(i).type());
                if(files.get(i).type().equals("image/jpeg") || files.get(i).type().equals("image/png")) {
                    picture = new Picture(project, title+"_bilde_"+(i+1), files.get(i));
                    project.addPicture(picture);
                } else {
                    error += "Fil nummer "+(i+1)+" er av typen "+files.get(i).type()+" og ikke av typen .JPG eller .PNG og ble dermed ikke lagt til. \n";
                }
            } else {
                error = "Ingen filer funnet";
            }
        }
    } else {
        error = "Velg en tittel for bildene";
    }
    if(error.equals("")) {
        flash.success("Picture(s) added");
    } else {
        flash.error(error);
    }
    addPicture(id);
}

Got it to work like this if anyone is ever interested:

public static void uploadPictures(long id, String title, File fake) {
    List<Upload> files = (List<Upload>) request.args.get("__UPLOADS");
    if(files != null) {
        Project project = Project.findById(id);
        Picture picture;
        Blob image;
        InputStream inStream;
        for(Upload file: files) {
            if(file != null) {
                try {
                    inStream = new java.io.FileInputStream(file.asFile());
                    image = new Blob();
                    image.set(inStream, new MimetypesFileTypeMap().getContentType(file.asFile()));
                    picture = new Picture(project, file.getFileName(), image);
                    project.addPicture(picture); // stores the picture
                } catch (FileNotFoundException e) {
                    System.out.println(e.toString());
                }
            }
        }
    }
    addPicture(id); //renders the image upload view
}

Would be happy to get a working solution with an array of Blob objects instead of having to request.args.get("__UPLOADS") if possible.

So you can use @As to bind the processing of a param to an specific Play TypeBinder

So with this:

public static void chargedMultiUpload(@As(binder = FileArrayBinder.class) Object xxx) throws IOException{ ... }

And this html

<input type="file" multiple name="files" id="files"/>

So, you have to make a cast with something like File[] doo = (File[])xxx;

Should <input type="file" multiple name="files" id="files"/> not be: <input type="file multiple" name="files" id="files"/> ?

Second of all, where do you actually save your image? I think you should save it in your loop, where you put project.addPicture(picture); , but actually it looks like the images are saved to the system in your last line: addPicture(id); This kinda explains why it saves the same image (last one or first one (not sure how they are parsed)) multiple times.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM