关于JFinal的单个input标签type=file的multiple="multiple"多图片上传,每次只接收到一个uploadFile对象的解决办法。

关于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、结果:这个问题就搞定了。


评论区

JFinal

2017-01-22 19:40

这几天很忙,才看到你的分享,非常感谢,赞一个 ^_^

肆锋

2017-02-24 16:47

函数获得的uploadFiles的size()都是1 ,而不是5。是哪里出了问题呢?

然后我给getFiles();加了个path = "123";

List uploadFiles = getFiles(path);为什么我给path赋值以后还是显示为一条?

要输就输给追求

2017-05-23 15:46

@JFinal 波总,这个问题3.1解决了没有?

JFinal

2017-05-25 14:19

@要输就输给追求 这个不需要在 jfinal 3.1 中解决,而是要在 cos 这个第三方中解决,刚刚已经更新了这个 cos 第三方,并上传到了 maven 中心库,maven 升级方式:
groupId:com.jfinal
artifactId:cos
version:2017.5

JFinal

2017-05-25 14:21

@要输就输给追求 新版本的 cos 不仅可以支持 input 的 name 重复,而且支持上传的文件是有序的,而且在上传文件长度超过范围时抛出 ExceededSizeException,便于应用程序中捕获处理

要输就输给追求

2017-05-25 17:03

@JFinal 那我是按照这个朋友提供的思路改呢,还是升级这个第三方库好呢?现在我是按照这个朋友提供的方法改的。没毛病。

JFinal

2017-05-25 17:56

@要输就输给追求 你直接升级就可以了,cos-2017.5.jar 这个版本比这 @韦甩甩 这篇分享提供的功能要更多更好,升级可适用于所有 jfinal 版本

klzz

2017-05-28 11:23

@JFinal cos官网上还是cos-26Dec2008.zip呀,确定有cos-2017.5这个版本?

JFinal

2017-05-28 12:02

@klzz 在 maven 中可以下载,这个版本是 jfinal 改进版,不是 cos 官方出的,cos 官方早就不维护这个项目了

ROMYIM

2017-08-14 10:14

@JFinal 我用的是cos-2017.5这个版本,但是上传文件还是出现楼主这个情况。这是为什么?

ROMYIM

2017-08-14 10:40

@JFinal 波总,为什么这种mutiple的上传方式是多次调用同一个action进行逐个上传而不能getFiles()得到所有文件。

JFinal

2017-08-14 12:24

@ROMYIM 前天晚上做直播的时候还演示过这个新功能,一定是可以的

ROMYIM

2017-08-14 13:33

@JFinal 波总,你是在哪一个平台直播?

JFinal

2017-08-14 14:23

@ROMYIM jfinal 俱乐部群里

老武

2017-09-14 14:41

我也遇到这个问题了,升级cos2017.5果然好了

will_小猿

2018-07-05 10:16

@JFinal@韦甩甩 非常感谢!!!今天遇到了这个问题,果然解决了,感谢!

JFinal

2018-07-05 11:43

@will_小猿 这个本身是 cos 这个第三方不支持,jfinal 给将这个 cos 第三方给改造了

热门分享

扫码入社