热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Java实现批量下载(打包成zip)的实现

这篇文章主要介绍了Java实现批量下载(打包成zip)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言

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

一、前端JS发送下载请求

1、ajax无法发送下载请求

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

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

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

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

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

        form表单也有局限性,例如form表单不能传输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();
});

        如上边代码所示,传参为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();
 }
}

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

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();
 // 压缩流不必关闭,使用完后再关
}

三、结束

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

到此这篇关于Java实现批量下载(打包成zip)的实现的文章就介绍到这了,更多相关Java 批量下载 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • Centos7 Tomcat9 安装笔记
    centos7,tom ... [详细]
  • 文章目录python包-requests关于requests包安装和使用pythonrequests请求超时设置工作中遇到的常见问题整理访问https网站,报错cer ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 解决Jenkins编译过程中ERROR: Failed to Parse POMs的问题
    在使用Jenkins进行自动化构建时,有时会遇到“ERROR: Failed to parse POMs”的错误。本文将详细分析该问题的原因,并提供有效的解决方案。 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • mysql 授权!!
    为什么80%的码农都做不了架构师?MySQL的权限系统围绕着两个概念:认证-确定用户是否允许连接数据库服务器授权-确定用户是否拥有足够的权限执 ... [详细]
  • 网络安全实验:Telnet与SSH服务对比及抓包分析
    本实验旨在对比Telnet和SSH两种安全通信协议的服务差异,并通过搭建服务器和使用Wireshark抓包工具进行详细分析。 ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • 使用System.getProperty()获取系统属性
    本文详细介绍了如何使用System.getProperty()方法获取Java运行时环境中的各种系统属性,包括Java版本、操作系统信息等。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
author-avatar
雷雨点H
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有