当前位置: 首页 > news >正文

Java 下载压缩zip

Java压缩zip

 /*** 下载压缩包** @param instId   实例id* @param response 响应* @author 梁伟浩* @date 2023-08-21*/@GetMapping("/downloadZip")@ApiOperation(value = "下载压缩包")@ApiImplicitParam(name = "instId", value = "实例id", required = true, paramType = "query", dataTypeClass = String.class)public void downloadZip(@RequestParam("instId") String instId, HttpServletResponse response) {Asserts.isEmpty(instId, "实例id[instId]不能为空");InputStream inputStream = null;OutputStream outputStream = null;try {businessContentService.zipAttachTree(instId,response);outputStream.flush();} catch (Exception e) {response.setStatus(SC_BAD_REQUEST);try {if (outputStream != null) {response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json;charset=utf-8");outputStream.write(JSON.toJSONString(R.fail(e.getMessage())).getBytes());}} catch (IOException ex) {throw new RuntimeException(ex);}} finally {try {if (outputStream != null) {outputStream.close();}} catch (IOException ex) {throw new RuntimeException(ex);}try {if (inputStream != null) {inputStream.close();}} catch (IOException ex) {throw new RuntimeException(ex);}}}
 @Overridepublic void zipAttachTree(String instId, HttpServletResponse response) {InstBusinessInfo instBusinessInfo = instBusinessInfoMapper.selectById(instId);String instTitle = instBusinessInfo.getInstTitle();if (instBusinessInfo == null) {throw new BusinessException(instId);}//获取附件树目录BusinessContentRequest instanceContentRequest = new BusinessContentRequest();BusinessContentResponse contentResponse = null;instanceContentRequest.setInstId(instId);instanceContentRequest.setGroupEnum(BusinessContentGroupEnum.DIR_TREE);try {contentResponse = this.getBusinessContent(instanceContentRequest);} catch (Exception e) {e.printStackTrace();}List<BusinessContentVO> contentVOList = contentResponse.getContentVOList();File directory = new File("./" + instTitle);directory.mkdir();//递归创建文件夹并把文件流放进对应文件夹this.getFileName(contentVOList, new StringBuilder(), instTitle);File file = new File("./" + instTitle);File zipFile = null;List<File> souceFileList = new ArrayList();try {souceFileList.add(file);zipFile = new File(instTitle + ".zip");ZipUtil.toZip(zipFile.getName(), souceFileList);BufferedInputStream fis = new BufferedInputStream(new FileInputStream(zipFile));byte[] buffer = new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8"));OutputStream toClient = new BufferedOutputStream(response.getOutputStream());toClient.write(buffer);toClient.flush();toClient.close();} catch (Exception e) {e.printStackTrace();} finally {//删除本地生成的文件夹与zip压缩包if (file!=null && file.exists()){FileUtil.del(file);}if (zipFile != null && zipFile.exists()) {zipFile.delete();}}}//递归生成文件夹并把流写到对应文件夹public void getFileName(List<BusinessContentVO> contentVOList, StringBuilder sb, String instTitle) {List<StringBuilder> fileNames = new ArrayList<>();for (BusinessContentVO contentVO : contentVOList) {OutputStream outputStream = null;StringBuilder newSb = new StringBuilder(sb); // 创建新的 StringBuilder 对象if (Func.isEmpty(contentVO.getDataId())) {File directory = new File("./" + instTitle + "/" + contentVO.getNodeName());directory.mkdir();newSb.append(contentVO.getNodeName() + "/");} else {String dataId = contentVO.getDataId();InstFileInfo instFileInfo = instFileInfoMapper.selectById(dataId);InputStream inputStream = minioTemplate.getObject(instFileInfo.getFilePath());String fileName = "./" + instTitle + "/" + sb + "/" + contentVO.getNodeName() + "";File outputFile = new File(fileName);try {//把文件夹创建成输出文件outputStream = new FileOutputStream(outputFile);byte[] buffer = new byte[1024];int length;//把文件写到对应的文件夹中while ((length = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, length);}inputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();}}List<BusinessContentVO> childrenList = contentVO.getChildren();if (childrenList != null) {getFileName(childrenList, newSb, instTitle); // 递归调用时使用新的 StringBuilder 对象}}}

将流写到文件中

 MultipartFile fileInputStream is = file.getInputStream();ZipInputStream zipInputStream = new ZipInputStream(is, Charset.forName("UTF-8"));File jsonFile = new File("./pre/" + zipEntryNameStr);this.writeFile(jsonFile.getAbsolutePath(), zipInputStream);/*** @描述 将流写到文件中* @作者 吕嘉伟* @日期 2023/3/30 17:49*/public void writeFile(String filePath, ZipInputStream zipInputStream) {try (OutputStream outputStream = new FileOutputStream(filePath)) {byte[] bytes = new byte[4096];int len;while ((len = zipInputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, len);}} catch (IOException ex) {System.out.println("解压文件时,写出到文件出错");}}

相关文章:

Java 下载压缩zip

Java压缩zip /*** 下载压缩包** param instId 实例id* param response 响应* author 梁伟浩* date 2023-08-21*/GetMapping("/downloadZip")ApiOperation(value "下载压缩包")ApiImplicitParam(name "instId", value "实例id", r…...

GTK3实现自定义列表

使用gtk,如果想自己定义列表,思路可以将每个列表项作为一个hbox,整个列表是一个vbox。通过对容器动态的添加删除,实现列表操作,同时添加任何自己所需要的控件。 下面的例子是实现一个显示图片、按钮和进度条的列表,并且进行上移下移,具有添加和删除列表项功能但没有演示…...

Go语言基础之数组

Array(数组) 数组是同一种数据类型元素的集合。 在Go语言中&#xff0c;数组从声明时就确定&#xff0c;使用时可以修改数组成员&#xff0c;但是数组大小不可变化。 基本语法&#xff1a; // 定义一个长度为3元素类型为int的数组a var a [3]int数组定义&#xff1a; var 数…...

信息安全从业者考试认证大全

证书是IT从业者知识水平能力的一个体现&#xff0c;考证同时也是拓展自身知识的一个方法。近年来&#xff0c;安全行业风生水起&#xff0c;各种认证层出不穷&#xff0c;眼花缭乱。这里不对任何一个证书做评价&#xff0c;只是做出介绍&#xff0c;在国内&#xff0c;对任何事…...

详解react 15~18新增特性

React 15.x 版本的新增特性&#xff1a; 创建组件类&#xff1a;在 React 15 中&#xff0c;可以使用 createClass 方法来创建组件类。这个方法允许你定义组件的生命周期方法、渲染函数以及其他功能。 PropTypes&#xff1a;React 15 引入了 PropTypes&#xff0c;它是一种用于…...

SpringBoot整合FFmpeg进行视频分片上传(Linux)

SpringBoot整合FFmpeg进行视频分片上传&#xff08;Linux&#xff09; 上传的核心思路&#xff1a; 1.将文件按一定的分割规则&#xff08;静态或动态设定&#xff0c;如手动设置20M为一个分片&#xff09;&#xff0c;用slice分割成多个数据块。 2.为每个文件生成一个唯一标识…...

eNSP综合小实验:VRRP、MSTP、Eth-Trunk、NAT、DHCP等技术应用

完成下图要求&#xff1a; 拓扑图&#xff1a; 配置命令&#xff1a; 由于交换机日志太多不便于复制&#xff0c;所以就复制命令。大概步骤如下&#xff1a; 第一步先分配IP地址&#xff0c;在sw1和sw2上创建VLAN100用于e0/0/3口配IP&#xff0c;在sw1、sw2、sw3、sw4上创建VL…...

正中优配:尾盘拉升的股票第二天的走势?

尾盘拉升是指买卖日快结束时股票价格呈现上涨的状况。关于许多投资者来说&#xff0c;这一般是好事情&#xff0c;因为它可认为他们带来更高的收益。但是&#xff0c;人们常常会问尾盘拉升的股票第二天的走势怎么。本文将从多个角度进行剖析。 首要&#xff0c;咱们需求认识到这…...

ios小组件报错:Please adopt containerBackground API

iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…...

基于AWS的3D模型搜索服务实现

3D模型广泛应用于计算机游戏、电影、工程、零售业、广告等许多领域。市场上有很多制作3D模型的工具&#xff0c;但几乎没有工具可以直观地搜索3D模型数据库以找到类似的3D模型 因为开发好的 3D 模型搜索工具非常具有挑战性。 它需要复杂的计算和 AI/ML 框架来创建模型描述符并提…...

pycharm远程连接docker容器

pycharm远程连接docker容器 1.根据镜像创建容器2.进入容器3.修改容器的root密码4. 容器安装openssh-server和openssh-client5.修改SSH配置文件6.重启ssh服务7. 退出测试8.配置pycharm并连接docker容器9. 选择docker环境 1.根据镜像创建容器 sudo docker run -itd --nameconn_t…...

开源全球地理空间数据可视化框架——Cesium学习(2023.8.21)

Cesium学习 2023.8.21 1、Cesium简介1.1 Github上的Cesium 2、Cesium下载安装使用2.1 方式一&#xff1a;页面在线引用2.2 方式二&#xff1a;页面离线使用2.3 方式三&#xff1a;完整项目使用 3、CesiumJS学习教程&#xff08;快速上手 API文档&#xff09;3、Cesium官方示例…...

RT-Thread学习日记——点亮LED

最近开始接触RT-Thread&#xff0c;后面会单独建立专栏以此记录我的学习过程&#xff0c;如果能给你的学习提供参考&#xff0c;本人倍感荣幸。 学习工具&#xff1a;正点原子战舰开发板 一、、点亮LED 在RT-Thread的配置项里搜索LED可以看到和LED相关的很多内容&#xff0c…...

粘包问题(TCP面向字节流批量发送数据导致)

粘包问题出现的原因 由于TCP协议网络传输数据的基本单位是字节流&#xff0c;所以当应用程序收到了传输的数据时&#xff0c;看到的是一连串的字节数据&#xff0c;而TCP协议网络传输数据有滑动窗口的机制&#xff08;核心就是批量传输数据&#xff0c;推荐看TCP中窗口和滑动窗…...

selenium Chrome驱动下载地址

Chrome驱动官方最新版下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 有稳定版&#xff0c;开发版等版本可以选择下载 选择 操作系统复制下载链接直接下载...

Linux命令200例:tar命令主要用于创建、查看和提取归档文件(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…...

【Django】Task4 序列化及其高级使用、ModelViewSet

【Django】Task4 序列化及其高级使用、ModelViewSet Task4主要了解序列化及掌握其高级使用&#xff0c;了解ModelViewSet的作用&#xff0c;ModelViewSet 是 Django REST framework&#xff08;DRF&#xff09;中的一个视图集类&#xff0c;用于快速创建处理模型数据的 API 视…...

FFMPEG RTMP流打开速度慢优化方法一

先上使用方法&#xff1a; codec_ctx->flags | AVFMT_FLAG_NOBUFFER; AVFMT_FLAG_NOBUFFER 标记如果没有设置&#xff0c;就会导致打开时探测的数据包丢AVFormatContext的缓存区中。 播放的时候&#xff0c;就从这些数据包开始&#xff0c;但是整个探测过程时间可能较长&…...

NextJs - Middleware(中间件)

中间件允许您在请求完成之前运行代码。然后&#xff0c;根据传入的请求&#xff0c;您可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。 中间件在缓存内容和路由匹配之前运行。 使用规则 使用项目根目录中的文件 middleware.ts&#xff08;或 .js&#xff09…...

记录几个Hudi Flink使用问题及解决方法

前言 如题&#xff0c;记录几个Hudi Flink使用问题&#xff0c;学习和使用Hudi Flink有一段时间&#xff0c;虽然目前用的还不够深入&#xff0c;但是目前也遇到了几个问题&#xff0c;现在将遇到的这几个问题以及解决方式记录一下 版本 Flink 1.15.4Hudi 0.13.0 流写 流写…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

链式法则中 复合函数的推导路径 多变量“信息传递路径”

非常好&#xff0c;我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题&#xff0c;统一使用 二重复合函数&#xff1a; z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y))​ 来全面说明。我们会展示其全微分形式&#xff08;偏导…...

负载均衡器》》LVS、Nginx、HAproxy 区别

虚拟主机 先4&#xff0c;后7...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...