java 提供压缩包下载接口_Java实现批量下载(打包成zip)

引言

批量下载思路,首先前端发送下载请求,携带必要参数,也可无参默认批量下载页面全部数据;后台接收后进行数据处理拿到要下载文件的下载地址,循环下载地址,用压缩流,将文件直接写入压缩包,最后利用文件下载将压缩包输出给前端。

一、前端JS发送下载请求

1、ajax无法发送下载请求

关于下载的常见需求无非就是点击按钮下载或者选中点击批量下载,点击下载或批量下载后,携带参数向后台发送下载请求,但是JS中的ajax无法触发浏览器的下载机制,这也是处于安全考虑,所以下载请求不可以通过发送ajax请求实现。

2、js发送下载请求:超链接方式

我们可以通过< a >标签实现,在a标签的href中拼接get请求并携带所需参数,如下

下载1

批量下载,前端可以传每条数据的id,用逗号拼接成字符串,后台接收后进行数据处理,然后进行批量下载,但是此方式有局限性,如果我选中了很多条数据,每条数据的id都是32位UUID,那get请求无法携带大量参数,所以这种方式并不适合批量下载,只适合单条数据下载。

3、js发送下载请求:拼接Form表单,并提交

form表单也有局限性,例如form表单不能传输json格式的数据,说白了,就是form无法将数据转为application/json格式,所以用此方式提交,后台不能用@RequestBody注解去接受整个对象

$('.download-btn').click(function () { // 如果要传选中行的id,则从页面获取到所有id,可以拿逗号拼接,放到输入框传给后台 // 如果需要把选中行整行数据传到后台,form表单不支持传json格式数据,所以可以把 // 选中行数据放入数组,转为json放入输入框,后台用String接收,然后再转回Obj var $dataForm = $( "" + "" + "" ); $dataForm.attr("action", 'localhost:8080/download'); $(document.body).append($dataForm); //提交表单,实现下载 $dataForm.submit();

});1

2

3

4

5

6

7

8

9

10

11

12

13

14

如上边代码所示,传参为ids,那如果你想传obj,可以用JSON.stringify()将前端对象或数组类型转为json字符串,然后赋值给表单的输入框,一并提交给后台,后台用String接收,然后再转回Object,我在测试过程中 js提交数据到后台(json)," 被转译 成了& quot;,如果你也遇到,请看这篇文章:文章链接

二、后台处理

此处省略接收参数,获取需要下载的文件的url,直接写死模拟:

@RequestMapping(value = "/download", method = RequestMethod.POST)

public void plistDownLoad(HttpServletResponse response) throws Exception {

// 此处模拟处理ids,拿到文件下载url List paths = new ArrayList<>(); paths.add("C:\\Users\\E480\\Desktop\\Study\\casul笔记.txt"); paths.add("C:\\Users\\E480\\Desktop\\Study\\config配置中心笔记.txt"); paths.add("C:\\Users\\E480\\Desktop\\Study\\GateWay.txt"); if (paths.size() != 0) { // 创建临时路径,存放压缩文件 String zipFilePath = "D:\\workspace-IDEA\\zip\\我的zip.zip"; // 压缩输出流,包装流,将临时文件输出流包装成压缩流,将所有文件输出到这里,打成zip包 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath)); // 循环调用压缩文件方法,将一个一个需要下载的文件打入压缩文件包 for (String path : paths) { // 该方法在下面定义 fileToZip(path, zipOut); } // 压缩完成后,关闭压缩流 zipOut.close(); //拼接下载默认名称并转为ISO-8859-1格式 String fileName = new String(("我的压缩文件.zip").getBytes(),"ISO-8859-1"); response.setHeader("Content-Disposition", "attchment;filename="+fileName); //该流不可以手动关闭,手动关闭下载会出问题,下载完成后会自动关闭 ServletOutputStream outputStream = response.getOutputStream(); FileInputStream inputStream = new FileInputStream(zipFilePath); // 如果是SpringBoot框架,在这个路径 // org.apache.tomcat.util.http.fileupload.IOUtils产品 // 否则需要自主引入apache的 commons-io依赖 // copy方法为文件复制,在这里直接实现了下载效果 IOUtils.copy(inputStream, outputStream); // 关闭输入流 inputStream.close(); //下载完成之后,删掉这个zip包 File fileTempZip = new File(zipFilePath); fileTempZip.delete(); }

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

将文件打包的方法,需要传一个压缩路径,和一个文件,一次只将一个文件写入压缩包

public static void fileToZip(String filePath,ZipOutputStream zipOut) throws IOException { // 需要压缩的文件 File file = new File(filePath); // 获取文件名称,如果有特殊命名需求,可以将参数列表拓展,传fileName String fileName = file.getName(); FileInputStream fileInput = new FileInputStream(filePath); // 缓冲 byte[] bufferArea = new byte[1024 * 10]; BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10); // 将当前文件作为一个zip实体写入压缩流,fileName代表压缩文件中的文件名称 zipOut.putNextEntry(new ZipEntry(fileName)); int length = 0; // 最常规IO操作,不必紧张 while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) { zipOut.write(bufferArea, 0, length); } //关闭流 fileInput.close(); // 需要注意的是缓冲流必须要关闭流,否则输出无效 bufferStream.close(); // 压缩流不必关闭,使用完后再关

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

三、结束

我也是第一次接触批量下载,它本身并不难,都只是一些IO的常规操作,没有弯弯绕绕,只是在实现完整功能的过程中踩到了一些坑,在此记录一下,以便加深印象和帮助他人吧~~

文章来源: blog.csdn.net,作者:LuckyWangxs,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_41563912/article/details/109592864

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值