
一:场景:
项目中需要做批量下载图片的功能。
思路一:后台拿到图片信息再循环的方式,实践后发现行不通,只能下载第一个文件。
原因:当第一次输出流关闭后请求结束,链接关闭,后续的循环已无意义。
思路二:后台不行就在前台进行循环,多次请求。实践后发现还是行不通,仍只能下载一个文件。
原因:没想明白希望大佬看到告知,感谢!
思路三:没办法只能将多个文件压缩后返回,实践成功。
原理:
1.创建压缩流写到服务器上的压缩文件(临时文件)
2.把服务器上要下载的多个文件写入该压缩文件
3.把压缩文件通过输出流传输给客户端(注意:必须在zipoutputstream流关闭后,否则下载下的文件会报不可预料的压缩文件末端)
4.删除服务器上的临时文件
二:遇到的问题:
1.一开始使用ajax请求方式传送请求,即使后台不报错浏览器也没有进行下载操作?
解释:因为response的原因,一般请求浏览器是会处理服务器输出的response,文件的下载是以二进制形式进行的。但是ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。所以虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
解决:
window.location.href = "/imgUpload/imgdownload?names="+names+"&paths="+paths;
2.使用ajax传输数组到后台时,后台接收到的值为null
解决:添加traditional : true
解释:jQuery需要调用jQuery.param序列化参数,默认traditional为false,就是说jquery会深度序列化参数对象,但servelt api无法处理深度序列化的参数对象,所以通过设置traditional 为true阻止深度序列化。
3.通过window.location.href拼接数组参数时向后台传递会报错。
解决:先对参数进行编码后再传递var paths = encodeURI(encodeURI(imgUrlList));后台配合解码可以获得编码前的内容
后端解码:String realFileName = java.net.URLDecoder.decode(names[i],"UTF-8");
原因:传递的参数中包含特殊的字符,不符合url的规范,所以先对其进行编码。值得一提的是编码后可以直接传递数组。
之后就是后台代码的编写了
4.返回文件名中文乱码。
response.setHeader( "Content-Disposition
本文详细探讨了在项目中实现批量下载图片功能所遇到的挑战和解决方案。首先,尝试后台循环下载失败,因请求在第一个文件下载后结束。接着,尝试前台循环请求同样无效,原因是ajax请求无法触发浏览器的下载机制。最终,通过将图片压缩成一个文件并返回成功实现批量下载。在过程中,解决了包括ajax传输数组参数为null、URL编码问题以及文件名乱码等技术难题。文章还提到了使用window.location.href触发下载和设置HTTP响应头来处理中文文件名乱码的方法。

138

被折叠的 条评论
为什么被折叠?



