java实现下载文件压缩包

业务背景:

在开发过程中,我们会遇到需要对文件(单个或多个)进行压缩并下载的功能需求,这里记录一下压缩多个文件的实现过程,或许有更好的方式请大家补充

前端实现一个按钮调下载压缩包的接口

<button icon="download" type="primary" @click="download">下载压缩包
<button><script>download () {location.href = faceConfig.basePath + '/download?' +'&fileIds=' + paramData.fileIds +   //业务参数,根据实际情况写},
</script>

后端接口实现:

controller控制层定义下载压缩包接口

    @GetMapping("download")public void download(String fileIds){readService.download(fileIds,getResponse());}

定义service服务层接口 

public interface ReadService {void download(String fileIds, HttpServletResponse response);
}

定义服务层接口实现类 

@Overridepublic void download(String fileIds, HttpServletResponse response) {String[] Ids = fileIds.split(",");Map map = new HashMap();Map bas64Map = new HashMap();File[] file = new File[Ids.length];File file1 = null;OutputStream output = null;BufferedOutputStream bufferedOutput = null;FileInputStream inStream = null;try {for (int i = 0; i < Ids.length; i++) {// 1.获取到要压缩的文件,这里是自己的业务逻辑,可根据实际情况去写,只要最后能拿到file就行Map paramMap = new HashMap();paramMap.put("Id", Ids[i]);map = certificatePrintReadMapper.getFileInfo(paramMap);bas64Map = WaterMarkUtils.createStringMark(map);String base64 = (String) bas64Map.get("qj");byte[] bytes = decode(base64);file1 = new File(Ids[i] + "证书.jpg");output = new FileOutputStream(file1);bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(bytes);// 2。文件放到文件数组里file[i] = file1;output.close();bufferedOutput.close();}// 3.创建压缩文件,将文件数组进行压缩File zip = new File("压缩包名字.zip");// 压缩文件zipFiles(file, zip);response.setContentType("*/*");response.addHeader("Content-Disposition", "attachment;filename=" + new String("压缩包名字.zip".getBytes(), "ISO8859-1"));ServletOutputStream outputStream = response.getOutputStream();inStream = new FileInputStream(zip);byte[] buf = new byte[4096];int readLength;while (((readLength = inStream.read(buf)) != -1)) {outputStream.write(buf, 0, readLength);}inStream.close();outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();} finally {if (bufferedOutput != null) {try {bufferedOutput.close();} catch (IOException e) {e.printStackTrace();}}if (inStream != null) {try {inStream.close();} catch (IOException e) {e.printStackTrace();}}}}//子方法,压缩文件public static void zipFiles(File[] srcfile, File zipfile) {byte[] buf = new byte[1024];FileInputStream in = null;try {ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipfile), StandardCharsets.UTF_8);//File file2 = null;for (int i = 0; i < srcfile.length; i++) {String filename = srcfile[i].getName();in = new FileInputStream(srcfile[i]);out.putNextEntry(new ZipEntry(filename));int len;while ((len = in.read(buf)) > 0) {out.write(buf, 0, len);}//                out.setEncoding("GBK");out.closeEntry();in.close();System.out.println(srcfile[i].delete());}out.close();} catch (IOException e) {//e.printStackTrace();} finally {try {if (in != null) {in.close();}} catch (IOException e) {//e.printStackTrace();}}}//子方法,将Base64转成字节数组public static byte[] decode(String str) {byte[] b = null;String result = null;if (str != null) {BASE64Decoder decoder = new BASE64Decoder();try {b = decoder.decodeBuffer(str);// result = new String(b, "utf-8");} catch (Exception e) {}}return b;}

这样就实现了一个将多个文件进行压缩并下载的功能啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/125047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins、ant、selenium、testng搭建自动化测试框架

如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入&#xff0c;然后写一些测试脚本&#xff0c;这就是你所说的自动化测试&#xff0c;其实这个还不能算是真正的自动化测试&#xff0c;你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗&#xff…

MySQL篇---第十篇

系列文章目录 文章目录 系列文章目录一、说说悲观锁和乐观锁二、怎样尽量避免死锁的出现?三、使用 MySQL 的索引应该注意些什么?一、说说悲观锁和乐观锁 悲观锁 说的是数据库被外界(包括本系统当前的其他事物以及来自外部系统的事务处理)修改保持着保守 态度,因此在整个数…

230 - Borrowers (UVA)

题目链接如下&#xff1a; Online Judge 代码如下&#xff1a; #include <iostream> #include <string> #include <algorithm> #include <vector> #include <map> // #define debugstruct book{std::string title;std::string author;bool is…

一条 SQL 是如何在 MyBatis 中执行的

前言 MyBatis 执行 SQL 的核心接口为 SqlSession 接口&#xff0c;该接口提供了一些 CURD 及控制事务的方法&#xff0c;另外还可以通过 SqlSession 先获取 Mapper 接口的实例&#xff0c;然后通过 Mapper 接口执行 SQL&#xff0c;Mapper 接口方法的执行最终还是委托到 SqlSe…

Linux学习第25天:Linux 阻塞和非阻塞 IO 实验(二): 挂起

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 为方便和上一节的衔接&#xff0c;在正式开始学习前&#xff0c;先把本节的思维导图引入&#xff1a; 二、阻塞IO实验 1.硬件原理图分析 2.实验程序 #define I…

数字时代新趋势:TikTok算法与海外网红营销的融合策略

在当今数字化时代&#xff0c;社交媒体已经成为品牌推广和市场营销的重要渠道。TikTok作为全球范围内最受欢迎的短视频平台之一&#xff0c;以其独特的算法和用户参与度&#xff0c;正日益成为海外网红营销的热门选择。本文Nox聚星将和大家探讨TikTok算法和海外网红营销之间的融…

全平台七合一万能DIY小程序源码系统 带完整搭建教程

近年来互联网技术的飞速发展&#xff0c;尤其是移动互联网的普及。随着微信、支付宝、百度、抖音、头条等平台的迅速崛起&#xff0c;小程序成为了这些平台上重要的应用形态。这些小程序的应用范围广泛&#xff0c;包括电商、教育、娱乐、生活服务等各个领域。然而&#xff0c;…

【二叉树经典题目】

根据二叉树创建字符串 本题的关键在于什么情况要省略括号&#xff0c;什么情况不能省略&#xff1a; 左右为空可以省略括号 左不为空&#xff0c;右为空可以省略括号左为空,右不为空不能省略括号 class Solution { public://1.左右为空可以省略括号//2.左不为空&#xff0c;右…

基于SSM的高校疫情防控出入信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

提高微星笔记本Linux下散热性能,MSI-EC 驱动新补丁发布

导读近日消息&#xff0c;今年早些时候&#xff0c;Linux 6.4 中添加了 MSI-EC 驱动程序&#xff0c;允许对 Linux 系统微星笔记本电脑进行更多控制。 MSI-EC 驱动程序近日迎来新补丁&#xff0c;为微星笔记本带来 Cooler Boost 功能。该功能允许提高笔记本电脑的风扇转速&…

Uniapp中嵌入H5( uniapp开发的H5),并且在H5中跳转到APP的指定页面

原生H5跳转uniapp开发的app方式&#xff1a; 1.在APP中使用web-view嵌入H5页面使用web-view组件实现 <template><view><web-view src"https://uniapp.dcloud.net.cn/component/web-view.html"></web-view></view> </template>…

从云到AI到大模型,阿里云始终和谁站在了一起?

引言&#xff1a;云的创新没有减缓 而且在加速深入百行百业 【科技明说 &#xff5c; 热点关注】 【全球云观察 | 每日看点】作为中国最大的云计算厂商&#xff0c;阿里云的产品矩阵覆盖越来越全面&#xff0c;越来越细致&#xff0c;越来越到位。 ​ 在2023杭州云栖大会现场…

java项目之医院病历管理系统(ssm框架)

项目简介 医院病历管理系统实现了以下功能&#xff1a; 管理员&#xff1a;个人中心、医院公告管理、用户管理、科室信息管理、医生管理、出诊信息管理、预约时间段管理、预约挂号管理、门诊病历管理、就诊评价管理、系统管理。医生&#xff1a;个人中心、出诊信息管理、预约…

File --JAVA

File --JAVA 构造方法 方法说明public File (String pathname)根据文件路径创建对象public File (String parent, String child)根据父路径名字字符串和子路径名字符串创建文件对象public File (String parent, String child)根据父路径对应文件对象和子路径名字符串创建文件…

企业计算机电脑中了locked勒索病毒怎么办,勒索病毒解密,数据恢复

网络技术的不断发展&#xff0c;为我们的企业带来了很大的便利&#xff0c;大部分企业都会选择合适的办公软件系统&#xff0c;方便自身的生产与运营。近期&#xff0c;网络上的locked勒索病毒又开始攻击企业的计算机服务器了&#xff0c;经过10月份云天数据恢复中心对企业数据…

02【Git分支的使用、Git回退、还原】

上一篇&#xff1a;01【Git的基本命令、底层命令、命令原理】 下一篇&#xff1a;03【Git的协同开发、TortoiseGit、IDEA的操作Git】 文章目录 02【Git分支的使用、Git回退、还原】一、分支1.1 分支概述1.1.1 Git分支简介1.1.2 Git分支原理 1.2 创建分支1.2.1 创建普通分支1.…

GPT做SQL查询引擎的自然语言

目录 面向企业查询的生成式人工智能 步骤1&#xff1a;将示例数据转换为单字符字符串 步骤2&#xff1a;为大型语言模型&#xff08;LM&#xff09;创建提示符 步骤3&#xff1a;将数据发送到OpenAI的API 步骤4&#xff1a;执行GPT返回的SQL代码的结果 步骤5(可选)&#…

NLP之多循环神经网络情感分析

文章目录 代码展示代码意图代码解读知识点介绍 代码展示 import pandas as pd import tensorflow as tf# 构建RNN神经网络 tf.random.set_seed(1) df pd.read_csv("../data/Clothing Reviews.csv") print(df.info())df[Review Text] df[Review Text].astype(str) …

iPhone没有信号无法付钱?这样的损友要远离

近段时间以来&#xff0c;网络频传iPhone的信号差&#xff0c;导致朋友外出吃饭&#xff0c;用iPhone的朋友无法付钱&#xff0c;而只好拿国产手机的自己付钱&#xff0c;如果遇上这样的朋友只能说你被骗了&#xff0c;那是朋友在坑你&#xff0c;这样的朋友绝对是损友&#xf…

796. 子矩阵的和(二维前缀和)

题目&#xff1a; 796. 子矩阵的和 - AcWing题库 思路&#xff1a; 1.暴力搜索&#xff08;搜索时间复杂度为O(n2)&#xff0c;很多时候会超时&#xff09; 2. 前缀和&#xff08;左上角&#xff08;二维&#xff09;前缀和&#xff09;&#xff1a;本题特殊在不是直接求前…