关于JFinal的单个input标签type=file的multiple="multiple"多图片上传,每次只接收到一个uploadFile对象的解决办法。
0、背景:我开发一个认证图片的上传功能,上传5张图片;我的上传图片的标签写法如下:
<input id="ziZhiImage5" name="ziZhiImage5" type="file" multiple="multiple" class="file-loading" accept="image/*"> 注意:form标签要加上method="post" enctype="multipart/form-data"
1、遇到问题:我发现每次我用List<UploadFile> uploadFiles = getFiles();
函数获得的uploadFiles的size()都是1 ,而不是5。是哪里出了问题呢?
然后我给getFiles();加了个path = "123";
List<UploadFile> uploadFiles = getFiles(path);
我发现这个路径下,有5张图片了,说明上传上来了,但是还是返回一张。
然后我就老办法,打断点,追踪代码,然后发现问题出在。
MultipartRequest这个类的的271行代码:
files.put(name, new UploadedFile(dir.toString(), filePart.getFileName(), fileName, filePart.getContentType()));
因为input的标签name = ziZhiImage5,每次name都一样,它往files里put的时候最后都覆盖了。找到问题了,就解决问题。
2、解决思路,我在上面那个代码上加了一个代码;
if(files.containsKey(name)) { name = name + UUIDGen.UUID(); } files.put(name, new UploadedFile(dir.toString(), filePart.getFileName(), fileName, filePart.getContentType()));
这样,你后期代码可以这样比较(注意indexOf函数):
List<UploadFile> uploadFiles = getFiles(path); for (UploadFile uploadFile : uploadFiles) { if (uploadFile.getParameterName().indexOf("ziZhiImage5") != -1) { ziZhiImage5List.add(uploadFile); } else { yingYeZhiZhaoImageList.add(uploadFile); } }
于是问题来了,我知道怎么搞定这个bug了,我把我的
if(files.containsKey(name)) { name = name + UUIDGen.UUID(); }
这行代码加入人家jar包的代码里。
3、最终解决办法,还是借助网络的力量,看见网友有个解决办法。
(1):在自己的src目录下建个包:com.oreilly.servlet
(2):把反编译的MultipartRequest.java,复制到这个包里
(3):把你的那行代码加进去;
备注:自己的类如果和jar的类名,包名一模一样,咱自己写的类优先级高。
4、结果:这个问题就搞定了。