java实现多个网络文件批量下载并压缩
时间:2022-07-26
本文章向大家介绍java实现多个网络文件批量下载并压缩,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
java
实现多个网络文件批量下载并压缩
1. 使用场景
文档管理模块,列表中显示的记录的每日文件上传保存的记录.每条数据中有一个字段存放了文件的存储地址文件服务器上
现在需要对列表数据批量下载,将多个文件一起下载并存放到一起通过zip
压缩包的形式下载到浏览器
2. 开发步骤
思路: 先将多个文件单独一个个下载存放在磁盘的某个位置,然后再将该文件数据进行压缩.
2.1 逐个下载并存放至指定路径
applicationProperties.getUploadPath();
读取配置文件指定的下载地址.
public List<String> downloadToLocal(List<String> urls){
// applicationProperties 来源于配置文件读取类,获取本地指定的临时存放区域
String rootPath = applicationProperties.getUploadPath();
File file = new File(rootPath);
if(!file.exists()){
file.mkdirs();
}
List<String> fileList = new ArrayList<>();
try {
File f = null;
FileOutputStream fos = null;
ZipOutputStream zos = null ;
for(String url : list){
String fileName = url.substring(url.lastIndexOf("/")+1);
byte[] bytes = fastDFSClient.downloadFile(url);
fileList.add(rootPath + "//" + fileName);
f = new File(rootPath + "//" + fileName);
fos = new FileOutputStream(f);
fos.write(bytes,0,bytes.length);
}
zipFile(fileList,response);
fos.flush();
fos.close();
return fileList;
} catch (Exception e){
throw new BadRequestAlertException("Batch download file failed",this.getClass().getSimpleName(),"Batch download file failed");
}
}
2.2 将多个文件放到文件夹并压缩在浏览器下载
public void zipFile(List<String> fileUlr, HttpServletResponse response){
byte [] bytes = new byte[1024];
String zipFileName= "图片压缩下载";
BufferedOutputStream bos = null ;
FileInputStream in = null;
ZipOutputStream out = null;
try {
bos = new BufferedOutputStream(response.getOutputStream());
response.reset();
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + zipFileName + ".zip");
out = new ZipOutputStream(bos);
for(String str : fileUlr) {
File file = new File(str);
if(!file.exists()){
log.error("文件被删除");
continue;
}
ZipEntry zEntry = new ZipEntry(file.getName());
out.putNextEntry(zEntry);
in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int read = 0;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
out.close();
bos.close();
log.info("========= 文件压缩成功 ============");
} catch (Exception e){
throw new BadRequestAlertException("zipFile_error" ,this.getClass().getSimpleName(),"zipfile_download_error");
}
}
2.3 指定本地路径直接下载
/**
* 下载文件到制定路径
* @param fileList
*/
public void zipFile(List<String> fileList){
String zipName ="批量下载.zip";
String zipPath = applicationProperties.getUploadPath() + "//" + zipName;
BufferedInputStream bis =null;
try {
ZipOutputStream zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipPath)));
for(String str : fileList) {
File file = new File(str);
if(!file.exists()){
log.error("文件被删除");
continue;
}
ZipEntry zEntry = new ZipEntry(file.getName());
zipOutput.putNextEntry(zEntry);
bis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[1024];
int read = 0;
while((read = bis.read(buffer)) != -1){
zipOutput.write(buffer, 0, read);
}
}
zipOutput.finish();
bis.close();
zipOutput.close();
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
}
}
3. 测试
@ApiOperation(value = "批量下载文件")
@GetMapping("/downloads")
public void mutilFileDownLoad(
@ApiParam(value = "文件路径 ,使用逗号拼接,",required = true) @RequestParam(value = "urls") String urls,
HttpServletResponse response
){
List<String> list = Arrays.asList(urls.split(","));
List<String> filelist = downloadToLocal(list);
zipFile(filelist);
}
- 验证方式一 这种方式只能确保接口没有问题,但是点击链接下载的文件是乱码的
- 验证方式二 可以直接将请求的接口直接
copy
在浏览器console
通过window.open("http://xxxxx")的方式验证
然后会自动弹出下载框框
- 【机器学习笔记之五】用ARIMA模型做需求预测用ARIMA模型做需求预测
- Capturing Packets in Linux at a Speed of Millions of PPS
- 【机器学习笔记之四】Adaboost 算法
- 【Java学习笔记之十九】super在Java继承中的用法小结
- 【Java学习笔记之二十一】抽象类在Java继承中的用法小结
- 【Java学习笔记之二十】final关键字在Java继承中的用法小结
- 基于Windows下python环境变量配置
- 【机器学习笔记之七】PCA 的数学原理和可视化效果
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
- 【专知-关关的刷题日记20】Leetcode 119. Pascal's Triangle II
- 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
- 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
- Java面向对象抽象类实例练习
- 经典JS闭包面试题
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- MySQL 案例:用户鉴权与 Host 优先级
- Http Post 快速使用
- 有赞Flutter插件开发与发布
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyGBS如何实现调阅EasyNVR的视频通道?
- gitlab CI/CD 相关问题
- 微信jssdk分享接口
- 有赞 Flutter 混编方案
- 最近开发问题
- echarts相关问题总结
- 视频上云EasyNTS组网硬件设备登录后自动下线并清除设备信息是什么原因?
- 震惊! 再也不怕蹭网被发现了!
- 国标GB28181协议客户端EasyGBS国标视频平台级联EasyNVR:EasyNVR到EasyGBS上是如何注册及注销的?
- git全局忽略文件配置
- 2018-10-16近期vue开发总结
- 有赞埋点实践