Java实现批量下载(打包成zip)的实现
引⾔
批量下载思路,⾸先前端发送下载请求,携带必要参数,也可⽆参默认批量下载页⾯全部数据;后台接收后进⾏数据处理拿到要下载⽂件的下载地址,循环下载地址,⽤压缩流,将⽂件直接写⼊压缩包,最后利⽤⽂件下载将压缩包输出给前端。
⼀、前端JS发送下载请求
1、ajax⽆法发送下载请求
关于下载的常见需求⽆⾮就是点击按钮下载或者选中点击批量下载,点击下载或批量下载后,携带参数向后台发送下载请求,但是JS中的ajax⽆法触发浏览器的下载机制,这也是处于安全考虑,所以下载请求不可以通过发送ajax请求实现。
2、js发送下载请求:超链接⽅式
我们可以通过< a >标签实现,在a标签的href中拼接get请求并携带所需参数,如下
<a href="localhost:8080/download/?ids=123,234&fileName=down">下载</a>
批量下载,前端可以传每条数据的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 = $(
"<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)
java下载过程public void plistDownLoad(HttpServletResponse response) throws Exception {
// 此处模拟处理ids,拿到⽂件下载url
List<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\\");
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 = OutputStream();
FileInputStream inputStream = new FileInputStream(zipFilePath);
// 如果是SpringBoot框架,在这个路径
// at.util.http.fileupload.IOUtils产品
// 否则需要⾃主引⼊apache的 commons-io依赖
// copy⽅法为⽂件复制,在这⾥直接实现了下载效果
// 关闭输⼊流linux如何进入shell
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 = Name();
FileInputStream fileInput = new FileInputStream(filePath);
/
/ 缓冲
byte[] bufferArea = new byte[1024 * 10];
left函数用法举例BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10);
// 将当前⽂件作为⼀个zip实体写⼊压缩流,fileName代表压缩⽂件中的⽂件名称
二叉树遍历的算法zipOut.putNextEntry(new ZipEntry(fileName));
cssci法学int length = 0;
// 最常规IO操作,不必紧张
while ((length = ad(bufferArea, 0, 1024 * 10)) != -1) {
zipOut.write(bufferArea, 0, length);
}
//关闭流
fileInput.close();
// 需要注意的是缓冲流必须要关闭流,否则输出⽆效
bufferStream.close();
// 压缩流不必关闭,使⽤完后再关
}
三、结束正则表达式表示空白字符
我也是第⼀次接触批量下载,它本⾝并不难,都只是⼀些IO的常规操作,没有弯弯绕绕,只是在实现完整功能的过程中踩到了⼀些坑,在此记录⼀下,以便加深印象和帮助他⼈吧~~
到此这篇关于Java实现批量下载(打包成zip)的实现的⽂章就介绍到这了,更多相关Java 批量下载内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论