当前位置: 首页 > 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 流写 流写…...

Kook Zimage 真实幻想 Turbo 光影效果专题:如何生成逼真的光影变化

Kook Zimage 真实幻想 Turbo 光影效果专题&#xff1a;如何生成逼真的光影变化 光影是画面的灵魂&#xff0c;好的光影能让AI生成的作品瞬间提升一个档次 我一直觉得&#xff0c;AI生成图像最迷人的地方就是光影效果的处理。一张普通的图片&#xff0c;只要光影到位&#xff0c…...

阿里通义Z-Image文生图模型进阶技巧:提示词编写与参数调整指南

阿里通义Z-Image文生图模型进阶技巧&#xff1a;提示词编写与参数调整指南 1. 模型概述与核心能力 1.1 Z-Image模型简介 阿里通义实验室开源的Z-Image是基于先进扩散模型的文生图AI系统&#xff0c;其GGUF量化版本在保持高质量生成能力的同时显著降低了硬件需求。该模型支持…...

国内主流大模型API调用入门与对比:DeepSeek/智谱GLM/Kimi/千问完整指南

国内主流大模型API调用入门与对比指南 随着人工智能技术的飞速发展&#xff0c;国内大模型厂商推出的API服务已经相当成熟本文将详细介绍DeepSeek、智谱GLM、Kimi&#xff08;月之暗面&#xff09;和阿里千问四大主流国产大模型的API调用方式&#xff0c;帮助开发者快速上手并选…...

三步告别电视盒子操作难题:TVBoxOSC开源工具终极指南

三步告别电视盒子操作难题&#xff1a;TVBoxOSC开源工具终极指南 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库&#xff0c;用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 还在为电视盒子复杂的操作界面而…...

RexUniNLU在舆情预警中的应用:突发事件检测

RexUniNLU在舆情预警中的应用&#xff1a;突发事件检测 1. 引言 社交媒体每天产生海量信息&#xff0c;如何在繁杂的数据中快速识别潜在危机事件&#xff0c;成为企业和机构面临的重要挑战。传统舆情监测往往依赖人工筛选和规则匹配&#xff0c;不仅效率低下&#xff0c;还容…...

越权检测神器Authz的隐藏技巧:90%测试员不知道的Cookie替换妙用

越权检测神器Authz的隐藏技巧&#xff1a;90%测试员不知道的Cookie替换妙用 在Web安全测试领域&#xff0c;越权漏洞一直是业务逻辑缺陷中的高频问题。传统的手动检测方法不仅效率低下&#xff0c;在多账户切换、动态凭证等复杂场景下更容易出现遗漏。BurpSuite的Authz插件虽然…...

CVPR2017目标跟踪神器ECO:从零配置到实战避坑指南(附Matlab代码)

CVPR2017目标跟踪神器ECO&#xff1a;从零配置到实战避坑指南&#xff08;附Matlab代码&#xff09; 在计算机视觉领域&#xff0c;目标跟踪一直是一个极具挑战性的研究方向。2017年CVPR会议上提出的ECO算法&#xff0c;以其高效的性能和出色的准确率迅速成为研究热点。本文将带…...

Unity URP使用后处理Render Texture无法变透明解决方法

直接用不透明纯黑然后用Shader把黑色部分变透明Shader "Custom/BlackToTransparent" {Properties{_MainTex ("Texture", 2D) "white" {}_BlackThreshold ("Black Threshold", Range(0, 1)) 0.01}SubShader{// 核心&#xff1a;开启透…...

UVM(二)win10+QuestaSim 进阶搭建UVM验证环境:从Hello UVM到实际测试案例

1. 从Hello UVM到实际测试案例的进阶之路 如果你已经按照上一篇教程成功运行了Hello UVM示例&#xff0c;现在该是时候迈向下一个阶段了。就像刚学会写"Hello World"的程序员不会止步于此一样&#xff0c;真正的UVM验证工程师需要掌握完整测试平台的搭建方法。我在实…...

中国1:100万地貌类型空间分布数据|14类精细划分|全国覆盖|SHP矢量|含海拔+起伏度属性

&#x1f50d; 数据简介 本数据集源自 《中华人民共和国地貌图集&#xff08;1:100万&#xff09;》&#xff08;科学出版社&#xff0c;2009年&#xff09;&#xff0c;由中国科学院地理科学与资源研究所牵头全国科研与制图单位共同编制&#xff0c;是全球首套海陆一体化百万分…...