我在使多个文件上传工作时遇到了一些问题。当我选择x文件时,它会成功通过,但第一个文件正在上传x次,而其他文件根本没有上传。有谁能够指出我做错了什么?
形式:
#{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}
处理文件:
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);
}
答案 0 :(得分:3)
如果有人对此感兴趣,可以这样工作:
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
}
很高兴能够获得一个包含Blob对象数组的工作解决方案,而不必在必要时使用request.args.get(“__ UPLOADS”)。
答案 1 :(得分:2)
因此,您可以使用@As将param的处理绑定到特定的Play TypeBinder
所以这个:
public static void chargedMultiUpload(@As(binder = FileArrayBinder.class) Object xxx) throws IOException{ ... }
这个HTML
<input type="file" multiple name="files" id="files"/>
所以,你必须使用File [] doo =(File [])xxx;
之类的东西进行演员表答案 2 :(得分:-1)
<input type="file" multiple name="files" id="files"/>
不应该是:<input type="file multiple" name="files" id="files"/>
?
其次,你在哪里实际保存你的形象?我认为你应该将它保存在你放置project.addPicture(picture);
的循环中,但实际上它看起来像是在你的最后一行保存到系统中:addPicture(id);
这样可以解释为什么它会保存相同的图像(最后一个或第一个(不确定它们如何被解析))多次。