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.
精彩评论