1. 使用场景
文档管理模块,列表中显示的记录的每日文件上传保存的记录.每条数据中有一个字段存放了文件的存储地址文件服务器上
现在需要对列表数据批量下载,将多个文件一起下载并存放到一起通过zip压缩包的形式下载到浏览器
2. 开发思路
因为有些需要是要按照某种分类保存并下载,因为可能存在多层文件夹,所有不能直接通过后去每个文件的流的形式往压缩包里面放,所以这里采用先下载的方式,将网络文件按照给定的规则创建文件夹并存放在本地临时目录,然后再去读写文件装成压缩流下载.
说明: 根据自己实际业务,由于需要批量下载的文件一起超过300兆,所以采用两拆分服务,先请求下载接口,使用多线程下载到服务器临时目录,然后隔一段时间去请求下载服务
2.1 文件批量下载到临时目录
controller层
@GetMapping("step/imgs/download/{id}")
@ApiOperation(value = "将指定巡检任务下的图片下载到本地")
public ResponseEntity uploadToLocal(@PathVariable("id") Integer id){
//这步根据个人的业务来获取下载信息集合
Map> imgMap = exportService.getImgMap(id);
exportService.imgTolocal(imgMap);
return ResponseEntity.ok("图片资源正在下载中,请5分钟以后再访问 : /step/imgs/download?id= ,进行文件下载");
}
复制代码
imgMap数据结构说明:
key: 文件夹名称
value: 存放文件数据表
字段如下
@ApiModelProperty(value = "ID, 修改时为必填")
private Integer id;
@ApiModelProperty(value = "巡检任务步骤表id")
private Integer taskPointStepId;
@ApiModelProperty(value = "图片,视频url")
private String imgUrl;
@ApiModelProperty(value = "缩略图url")
private String imgThumbnailUrl;
@ApiModelProperty(value = "类型0:图片,1:视频")
private Integer type;
private String pointName;
private String stepName;
复制代码
service层
void imgTolocal(Map> res);
复制代码
service实现类
@Override
public void imgTolocal(Map> res){
index = 0;
if(res == null || res.isEmpty()){
throw new BadRequestAlertException("has_not_imgList" ,this.getClass().getSimpleName(),"has_not_imgList");
}
// 获取系统临时