Java多文件压缩下载解决方案,供大家参考,具体内容如下
<强>需求:强>
会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载压缩压缩文件的链接,每个邮政压缩文件都是由公司运营人员将页面需要下载的文件全部压缩成一个ZIP压缩文件,然后通过公司的交易运营平台上传至文件资料系统,会员运营平台则可以直接获取ZIP压缩文件地址进行下载
下面是一个页面示例:
<强>需求分析:强>
通过上面需求和页面可以分析出,公司运营人员将页面全部需要下载的文件进行压缩压缩后上传文件资料系统确实是一个紧急的解决方案,但是考虑到后面需求变更,页面需要下载的文件也会跟着变更,每次变更需求,公司运营人员都需要重新进行压缩文件,程序也需要进行相应的修改,这样对于程序的维护性不友好,站在使用系统的客户角度,每次都需要重新上传,因此临时解决方案不再符合软件的良好扩展性和操作方便,因此才有了对页面需要全部下载的文件使用程序压缩处理并下载。
<>强解决思路:强>
前端传递Ids字符串
由于会员运营系统显示需要下载的文件是资料系统中的每条文件记录的Id,因此前端页面只需要将需要下载的所有文件Ids字符串(比如:12、13、14)传递到后台即可。
后台处理
首先获取到前端传递的ids字符串,将其转换为整数[]的id数组,然后调用文件资料微服务根据id列表查询对应的文件记录(包含文件类型和文件地址路径等信息),获取到所有需要下载的文件路径后压缩成ZIP格式的文件进行下载。
<强>具体实现压缩下载方案:强>
第一种:先压缩成ZIP格式文件,再下载
第二种:边压缩ZIP格式文件边下载(直接输出ZIP流)
前端具体实现代码:
由于全部下载是一个一个链接标签,于是使用Ajax异步下载,后来功能实现后点击下载一点反应都没有,一度怀疑是后台出的错,但是后台始终没有报的错,在网上看了一下Ajax异步不能下载文件(也就是Ajax不支持流类型数据),具体原因可以百度这篇博客,<强>给到的解释是:强>
<强> 强>
ajax的返回值类型是json文本、html、xml类型,或者可以说ajax的接收类型只能是字符串字符串,不是流类型,所以无法实现文件下载。但用ajax仍然可以获得文件的内容,该文件将被保留在内存中,无法将文件保存到磁盘。这是因为JavaScript无法和磁盘进行交互,否则这会是一个严重的安全问题,js无法调用到浏览器的下载处理机制和程序,会被浏览器阻塞。
解释的还算是比较好的。后面会写一篇=文章详细分析Ajax异步下载解决方案。
接下来考虑使用形式表单标签实现,最终配合使用输入标签实现了前端传递id列表的问题,点击一个链接标签触发提交形式标签即可。
在每一个需要下载的文件增加一个隐藏的输入标签,价值值是这个文件的id值
具体点击一个链接标签提交表单的JS代码:
后端具体实现代码:
第一种方案实现:
第二种方案实现:
<强>附上完整代码:强>
压缩下载控制器
包com.huajin.jgoms.controller.user; 进口java.io.File; 进口java.io.FileOutputStream; 进口java.io.IOException; 进口并不知道; 进口java.util.Objects; 进口java.util.stream.Collectors; 进口javax.servlet.http.HttpServletResponse; 进口org.apache.commons.collections.CollectionUtils; 进口org.apache.commons.lang3.ObjectUtils; 进口org.apache.commons.lang3.StringUtils; 进口org.springframework.beans.factory.annotation.Autowired; 进口org.springframework.stereotype.Controller; 进口org.springframework.web.bind.annotation.RequestMapping; 进口com.huajin.baymax.logger.XMsgError; 进口com.huajin.baymax.logger.Xlogger; 进口com.huajin.common.util.UUIDUtil; 进口com.huajin.exchange.domain.sys.FeFileCenter; 进口com.huajin.exchange.enums.sys.SysParamKey; 进口com.huajin.exchange.po.sys.SysParamPo; 进口com.huajin.jgoms.controller.HjBaseController; 进口com.huajin.jgoms.service.FeFileCenterService; 进口com.huajin.jgoms.service.SysParamService; 进口com.huajin.jgoms.util.CompressDownloadUtil;/* * *压缩下载文件 * * @author hongwei.lian * @date 2018年9月6日下午6:29:05 */@ controller @RequestMapping ("/compressdownload”) 公开课CompressDownloadController延伸HjBaseController { @ autowired 私人FeFileCenterService FeFileCenterService; @ autowired 私人SysParamService SysParamService;/* * *多文件压缩下载 * * @author hongwei.lian * @date 2018年9月6日下午6:28:56 */@RequestMapping ("/downloadallfiles”) 公共空间downloadallfiles () {//1,根据ids查询下载的文件地址列表 字符串id=()请求.getParameter (" id "); 如果(StringUtils.isEmpty (ids)) { 返回; }//址楦谋湮褪? 整数[]idsInteger=CompressDownloadUtil.toIntegerArray (ids); Listjava多文件压缩下载的解决方法