Java将多个文件打包成ZIP并下载
2021/10/29 12:09:27
本文主要是介绍Java将多个文件打包成ZIP并下载,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java将多个文件打包成ZIP并下载
需求是多个文件需要同时打包成zip压缩文件并下载到本地,首先我需要的是知道下载文件的路径。我有一个专门的sys_file_info表,表中有对应的文件路径。业务表中的文件地址放的就是文件表的id值。下面是代码:
1.Mapper层
<select id="selectScriptPathList" parameterType="String" resultType="map"> SELECT i.file_path filePath, i.file_name fileName FROM ves_data_poc p LEFT JOIN sys_file_info i ON p.script_url = i.file_id WHERE i.file_path IS NOT NULL AND p.id IN <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </select>
List<Map<String, String>> selectScriptPathList(String[] ids);
2.Service层
idStr 是前端传来的多个id值用逗号连接的字符串
/** * 下载ZIP包 * @param idStr * @param response */ void download(String idStr, HttpServletResponse response);
@Override public void download(String idStr, HttpServletResponse response) { if (StringUtils.isNotEmpty(idStr)) { String[] ids = idStr.split(","); List<Map<String, String>> filePaths = vesDataPocMapper.selectScriptPathList(ids); String zipName = "POC_" + ((int) (Math.random() * 10000)) + ".zip"; String zipPath = Global.getProfile() + "/" + zipName; CompressUtil.compress(filePaths, zipPath, false); File pocZipFile = new File(zipPath); CompressUtil.downloadZip(response, zipName, pocZipFile); } }
3.Controller层
/** * 下载poc文件 支持多个下载 * 格式 zip包 * * @param ids */ @Log(title = "数据管理-POC", businessType = BusinessType.EXPORT) @GetMapping("/download") public void download(String ids, HttpServletResponse response) { vesDataPocService.download(ids, response); }
4.工具类
import org.apache.commons.lang3.StringUtils; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class CompressUtil { /** * 生成zip压缩文件 * @param filePaths * @param zipFilePath * @param keepDirStructure */ public static void compress(List<Map<String, String>> filePaths, String zipFilePath, Boolean keepDirStructure) { byte[] buf = new byte[1024]; File zipFile = new File(zipFilePath); try { ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile)); for (int i = 0; i < filePaths.size(); i++) { String relativePath = filePaths.get(i).get("filePath"); String relativeName = filePaths.get(i).get("fileName"); if (StringUtils.isEmpty(relativePath)) { continue; } File sourceFile = new File(relativePath); if (sourceFile == null || !sourceFile.exists()) { continue; } FileInputStream fis = new FileInputStream(sourceFile); if (keepDirStructure != null && keepDirStructure) { zos.putNextEntry(new ZipEntry(relativePath)); } else { zos.putNextEntry(new ZipEntry(i + "_" + relativeName)); } int len; while ((len = fis.read(buf)) > 0) { zos.write(buf, 0, len); } zos.closeEntry(); // zos.close(); } zos.close(); if (!zipFile.exists()) { zipFile.createNewFile(); } } catch (Exception e) { e.printStackTrace(); } } /** * 下载zip * * @param response * @param zipName 浏览器header中zip名称 * @param zipFile zipFile文件 */ public static void downloadZip(HttpServletResponse response, String zipName, File zipFile) { //下载文件 try { response.setCharacterEncoding("utf-8"); response.setContentType("application/zip"); response.setHeader("Content-Disposition", "attachment;FileName=" + zipName); ServletOutputStream out = response.getOutputStream(); int len = 0; byte[] buffer = new byte[1024]; FileInputStream fis = new FileInputStream(zipFile); while ((len = fis.read(buffer)) > 0) { out.write(buffer, 0, len); out.flush(); } out.close(); fis.close(); response.flushBuffer(); } catch (IOException e) { e.printStackTrace(); } } }
这篇关于Java将多个文件打包成ZIP并下载的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-22项目:远程温湿度检测系统
- 2024-12-21《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》简介
- 2024-12-21后台管理系统开发教程:新手入门全指南
- 2024-12-21后台开发教程:新手入门及实战指南
- 2024-12-21后台综合解决方案教程:新手入门指南
- 2024-12-21接口模块封装教程:新手必备指南
- 2024-12-21请求动作封装教程:新手必看指南
- 2024-12-21RBAC的权限教程:从入门到实践
- 2024-12-21登录鉴权实战:新手入门教程
- 2024-12-21动态权限实战入门指南