批量下载

  • 引言
  • 一、前端JS发送下载请求
    • 1、ajax无法发送下载请求
    • 2、js发送下载请求:超链接方式
    • 3、js发送下载请求:拼接Form表单,并提交
  • 二、后台处理
  • 三、结束

引言

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

一、前端JS发送下载请求

1、ajax无法发送下载请求

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

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

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

<a href="http://localhost:8080/download/?ids=123,234&fileName=down">下载</a>

批量下载,前端可以传每条数据的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接收,然后再转回Objvar $dataForm = $("<form type='hidden' method='post'>" +"<input type='hidden' id='ids' name='ids' value='" + ids + "' type='text'/>" +"</form>");$dataForm.attr("action", 'localhost:8080/download');$(document.body).append($dataForm);//提交表单,实现下载$dataForm.submit();
});

如上边代码所示,传参为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,拿到文件下载urlList<String> 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();}
}

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

public static void fileToZip(String filePath,ZipOutputStream zipOut) throws IOException {// 需要压缩的文件File file = new File(filePath);// 获取文件名称,如果有特殊命名需求,可以将参数列表拓展,传fileNameString 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();// 压缩流不必关闭,使用完后再关
}

三、结束

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

Java实现批量下载(打包成zip)相关推荐

  1. java文件批量下载打包成zip

    1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台. ................ 2 .下面就是获取字符串之后的批量下载/*** 多文件批量下载压缩成zip**root ...

  2. 多文件批量下载打包成.zip

    多文件批量下载打包成.zip //下载文件打包成zip压缩包@GetMapping("/zip/{id}")public void zip(@PathVariable(" ...

  3. EasyExcel3.0.5 导出多个sheet,批量下载打包成ZIP压缩包

    多sheet导出并批量下载附件 前言 源码 代码实现 Controller 接口类 实现类 (重中之重) 实现类重点强调 测试 结语 前言 最近浏览语雀社区官网,里面有一篇 easyexcel 里面 ...

  4. spring mvc java 把多文件打包成zip,并下载

    再来一篇 /*** 压缩并导出文件* @param zipPath 压缩文件临时路径 路径最后不要有 /* @param zipName 压缩为文件名 **.zip* @param createFil ...

  5. Java如何将文件打包成Zip、Rar压缩包

    目录 1.将单个文件打成压缩包 2.将E:\zip目录打成压缩包 1.将单个文件打成压缩包 需求: 将E盘下的 test.xls 文件打成压缩包保存到E盘目录下的 target.zip 文件中 代码实 ...

  6. java后台批量下载文件压缩ZIP

    @RequestMapping(value = "xxx/xxx",method = RequestMethod.POST )@ResponseBodypublic Map< ...

  7. java批量文件打包成压缩成zip下载和大量数据导出excel时的处理方法

    对于我们来说,java导出数据成excel或其他数据文件,或者下载资源是开发中的家常便饭, 但是在导出的时候,如果点击一个按钮导出几百万条数据,如果不作处理的话很可能会出现一系列的问题. 这里介绍打包 ...

  8. Java实现文件批量下载,打包成zip压缩包

       最近在做一个管理系统的项目,需要实现一个功能,就是批量下载文件,并打包成zip压缩包.    前端通过POST请求传来要下载的文件列表,Java代码实现如下: import java.io.Bu ...

  9. Java将多个文件打包成ZIP并下载

    Java将多个文件打包成ZIP并下载 需求是多个文件需要同时打包成zip压缩文件并下载到本地,首先我需要的是知道下载文件的路径.我有一个专门的sys_file_info表,表中有对应的文件路径.业务表 ...

最新文章

  1. 大数据实战之环境搭建(八)
  2. what to improve on my case study?
  3. Canada Cup 2016 C. Hidden Word 字符串构造
  4. cif文件服务器搭建,在linux下搭建NFS服务器实现文件共享
  5. 在vue-cli 中使用 axios
  6. 从折叠屏到AR 三星Galaxy新品预热宣传片大招频现
  7. 结构体可以整体交换吗_结构胶能够耐高温吗?可以在高温环境中工作吗?好用吗?...
  8. 理想传输线终端短路开路和接纯电抗的沿线电压电流分布
  9. 啊哈C语言 第5章 好戏在后面(第24-25讲)
  10. awg线径与电流_AWG线径对照表
  11. 嵌入式学习(一)嵌入式c语言
  12. MPEG-2与MPEG-4
  13. 华为防火墙简介及其工作原理
  14. python黑马教程ppt_,python基础教程 PPT
  15. 【教程搬运】读懂github上的工程代码——带你熟悉Python中的Parser
  16. 王晓亮:关于技术人的十年!
  17. MATLAB 车牌识别程序介绍 SVM、神经网络[毕业设计]
  18. virtualbox导入ovf文件
  19. php 字符串m5加密解密_PHP加密解密字符串汇总
  20. 杰理之设备配网及使用第三方平台【篇】

热门文章

  1. windows 双网卡配置
  2. 第六章第二题(求一个整数各位数字之和)(Sum the digits in an integer)
  3. 初等数学复习之方程和方程组(多项式的待定系数法)
  4. 一文了解各种高精度室内定位技术
  5. c语言期末总结1000,C语言期末考试总结,看完保你过.ppt
  6. STM32CubeMX生成工程顺序
  7. 最高法规范区块链证据,司法链将走向全国统一
  8. oocss_面向对象CSS(OOCSS)的基础
  9. moment 时间格式
  10. 用 document.readyState == complete 判断页面是否加载完成