java实现文件打包压缩输出到浏览器下载
文件打包压缩输出到浏览器下载
java批量下载文件打包压缩工具类,输出到浏览器下载,可以自己改名。
一、工具类:
入参 :文件LIst ;打包后的名字 ;响应到浏览器
/*** 功能:压缩多个文件,输出压缩后的zip文件流** @param srcfile:源文件列表* @param zipFileName:压缩后的文件名* @param response:Http响应*/public void zipFiles(Listsrcfile, String zipFileName, HttpServletResponse response) throws IOException {byte[] buf = new byte[1024]; // 获取输出流BufferedOutputStream bos = null; try {bos = new BufferedOutputStream(response.getOutputStream()); } catch (IOException e) {e.printStackTrace(); }FileInputStream in = null; ZipOutputStream out = null; try {response.reset(); // 重点突出// 不同类型的文件对应不同的MIME类型response.setContentType("application/x-msdownload"); response.setCharacterEncoding("utf-8"); response.setHeader("Content-disposition", "attachment; filename=" + zipFileName + ".zip"); // ZipOutputStream类:完成文件或文件夹的压缩out = new ZipOutputStream(bos); for (int i = 0; i < srcfile.size(); i++) {in = new FileInputStream(srcfile.get(i)); // 给列表中的文件单独命名out.putNextEntry(new ZipEntry(srcfile.get(i).getName())); int len = -1; while ((len = in.read(buf)) != -1) {out.write(buf, 0, len); }}out.close(); bos.close(); log.info("压缩完成."); } catch (Exception e) {e.printStackTrace(); } finally {if (in != null) in.close(); if (out != null) out.close(); }}
二、调用
zipFiles(files, zipName, response);
生成zip文件并浏览器导出 【java实现文件打包压缩输出到浏览器下载】总结一下,关于Java下载zip文件并导出的方法,浏览器导出。
String downloadName = "下载文件名称.zip"; downloadName = BrowserCharCodeUtils.browserCharCodeFun(request, downloadName); //下载文件名乱码问题解决//将文件进行打包下载try {OutputStream out = response.getOutputStream(); byte[] data = https://www.it610.com/article/createZip("/fileStorage/download"); //服务器存储地址response.reset(); response.setHeader("Content-Disposition","attachment; fileName="+downloadName); response.addHeader("Content-Length", ""+data.length); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(data, out); out.flush(); out.close(); } catch (Exception e) {e.printStackTrace(); }
获取下载zip文件流
public byte[] createZip(String srcSource) throws Exception{ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); //将目标文件打包成zip导出File file = new File(srcSource); a(zip,file,""); IOUtils.closeQuietly(zip); return outputStream.toByteArray(); }
public void a(ZipOutputStream zip, File file, String dir) throws Exception {//如果当前的是文件夹,则进行进一步处理if (file.isDirectory()) {//得到文件列表信息File[] files = file.listFiles(); //将文件夹添加到下一级打包目录zip.putNextEntry(new ZipEntry(dir + "/")); dir = dir.length() == 0 ? "" : dir + "/"; //循环将文件夹中的文件打包for (int i = 0; i < files.length; i++) {a(zip, files[i], dir + files[i].getName()); //递归处理}} else {//当前的是文件,打包处理//文件输入流BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipEntry entry = new ZipEntry(dir); zip.putNextEntry(entry); zip.write(FileUtils.readFileToByteArray(file)); IOUtils.closeQuietly(bis); zip.flush(); zip.closeEntry(); }}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 事件代理
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Java|Java OpenCV图像处理之SIFT角点检测详解
- Node.js中readline模块实现终端输入
- django-前后端交互