如何在Springboot项目中读取zip压缩包并且把文件导出成zip压缩包

文章目录

    • 设想场景
    • 实现流程
    • 小结

设想场景

为方便老师录入大量学生图片信息,在添加照片时,学生的相关资料以身份证号码+图片描述命名如
(1231231234567+一寸照片.jpg)
(1231231234567+身份证正面照片.jpg)
(1231231234567+身份证背面照片.jpg)
(1231231234567+毕业证照片.jpg)
(1231231233123+学位证照片.jpg)
压缩zip后上传保存学生资料
并实现后续可下载指定学生的资料包。

实现流程

就是一读写操作。

下面是代码实现

@PostMapping("/importZip")
public void importZip(MultipartFile file) {studentService.importZip(file);
}
import org.springframework.mock.web.MockMultipartFile;public void importZip(MultipartFile file) {Map<String, MultipartFile> fileMap = new HashMap<>();try {// 获取zip文件输入流ZipInputStream zipInputStream = new ZipInputStream(file.getInputStream(), Charset.forName("GBK"));// 转成 名字对应文件流的mapfileMap = convertToMultipartFile(zipInputStream);for (Map.Entry<String, MultipartFile> stringFileEntry : fileMap.entrySet()) {// 上传并返回新文件名称// 上传这块走自己的接口咯、目的是上传图片后获取url保存起来String url = FileUploadUtils.upload(filePath, stringFileEntry.getValue());}}catch (Exception e){e.printStackTrace();}}public static  Map<String, MultipartFile> convertToMultipartFile(ZipInputStream zipInputStream) throws IOException {Map<String, MultipartFile> result = new HashMap<>();// 读取zip文件中的条目ZipEntry zipEntry = zipInputStream.getNextEntry();while (zipEntry != null) {if (!zipEntry.isDirectory()) {byte[] bytes = readAllBytesFromZipInputStream(zipInputStream);// 创建MockMultipartFile并返回result.put(zipEntry.getName(), new MockMultipartFile(zipEntry.getName(), zipEntry.getName(),"", new ByteArrayInputStream(bytes)));zipInputStream.closeEntry();}zipEntry = zipInputStream.getNextEntry();}zipInputStream.close();return result;}public static byte[] readAllBytesFromZipInputStream(ZipInputStream zipInputStream) throws IOException {ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = zipInputStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}return byteArrayOutputStream.toByteArray();}

好的、上面的代码可以实现导入zip并且把压缩包里的文件名和文件流一一返回给你了。

你只需要把文件流调上传你的接口、并把文件名和url存下来,后面会用到。

下面我们来说说、正面把上传的文件、压缩成zip 导出。

	public void download(HttpServletResponse response, String studentId) {//!!!把你的资料获取出来!!!List<String> imageUrls = null;//!!!把你的资料获取出来!!!// 创建一个临时文件夹,用于存放下载的图片File tempFolder = new File("/newFile");tempFolder.mkdirs();try {// 遍历图片URL列表,下载并压缩图片for (String imageUrl : imageUrls) {try (BufferedInputStream in = new BufferedInputStream(bufferedReader(imageUrl));FileOutputStream fileOutputStream = new FileOutputStream(tempFolder.getPath() + "/" +  imageUrl.substring(imageUrl.lastIndexOf("/") + 1))) {byte[] dataBuffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {fileOutputStream.write(dataBuffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();}}// 创建临时压缩文件File zipFile = File.createTempFile("相关资料", ".zip");FileOutputStream fos = new FileOutputStream(zipFile);ZipOutputStream zos = new ZipOutputStream(fos);// 压缩文件夹内的文件File folder = new File(tempFolder.getPath());compressFolder(folder, zos);// 关闭流zos.close();fos.close();// 设置响应头response.setContentType("application/zip");response.setHeader("Content-Disposition", "attachment; filename=\"" + zipFile.getName() + ".zip\"");// 将压缩文件写入响应输出流FileInputStream fis = new FileInputStream(zipFile);BufferedInputStream bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = bis.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}bis.close();fis.close();os.flush();os.close();// 删除临时压缩文件zipFile.delete();} catch (IOException e) {e.printStackTrace();} finally {//删除临时文件夹及其文件deleteFolder(tempFolder);}}public InputStream bufferedReader(String url) throws IOException {//!!!!设置超时时间、不然遇到偶发性的url失效找不到图片就会直接报错、后面都不走了!!!URL downloadUrl = new URL(urlEncodeChinese(url));HttpURLConnection httpURLConnection = (HttpURLConnection) downloadUrl.openConnection();httpURLConnection.setRequestMethod("GET");httpURLConnection.setDoOutput(true);httpURLConnection.setDoInput(true);httpURLConnection.setUseCaches(false);//设置超时时间httpURLConnection.setConnectTimeout(1000);httpURLConnection.setReadTimeout(1000);return httpURLConnection.getInputStream();}// 递归删除文件夹及其文件private void deleteFolder(File folder) {File[] files = folder.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {deleteFolder(file);} else {file.delete();}}}folder.delete();}

小结

本篇文章 就是解决 在Java项目中实现资料包的导入读取并导出压缩包,加强文件读写的能力 冲!!!。

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

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

相关文章

中小企业体育代言:探索费用策略与实际操作

随着体育市场的不断扩大和企业品牌的不断提升&#xff0c;中小型企业正逐渐将目光投向了体育明星代言&#xff0c;希望通过这一策略来提升品牌知名度、美誉度&#xff0c;进而吸引目标消费者的注意力并提升销售量。然而&#xff0c;中小型企业请体育明星代言的费用究竟是多少呢…

docker 离线模式-部署容器

有网络的情况下下载需要的镜像 比如(下面以tomcat为例子&#xff0c;其他镜像类似) docker pull tomcat打包镜像文件到本地 docker save tomcat -o tomcat.tar将tomcat.tar 上传到内网服务器&#xff08;无外网环境&#xff09; 导入镜像 docker load -i tomcat.tar创建容器…

element-ui的el-dialog,简单的封装。

el-dialog是使用率很高的组件 使用el-dialog很多都是按照文档的例子&#xff0c;用一个变量控制是否显示&#xff0c;再来一个变量控制标题。 如果我这个对话框多个地方使用的话还要创建多个变量&#xff0c;甚至关闭之后还要清空一些变量&#xff0c;应该可以简化一点。我写…

Windows Hyper-V Ubuntu 22.04 LTS安装

文章目录 Ubuntu准备Hyper-V启用虚拟化支持services.msc 打开服务列表&#xff0c;关注Hyper-V服务是否启动打开管理器创建虚拟机 启动备份 Ubuntu 下载Ubuntu-Desktop&#xff0c;这是个iso文件。 准备 20GB以上的磁盘空间&#xff0c;ubuntu安装后的虚拟磁盘文件超过15GB一…

C/C++test两步完成CMake项目静态分析

您可能一直在静态分析中使用CMake。但您是否尝试过将Parasoft C/Ctest与CMake一起使用吗&#xff1f;以下是如何使用C/Ctest在基于CMake的项目中运行静态分析的详细说明。 CMake是用于构建、测试和打包软件的最流行的工具之一。Parasoft C/Ctest通过简化构建管理过程&#xff…

【Minecraft】Fabric Mod开发完整流程1 - 环境配置与第一个物品

前言 Fabric 是 Minecraft 一款非官方的模组 API,与 Forge mod 不同。它以轻量级和高性能为设计目标,专注于支持新版本的 Minecraft。 Fabric 和 Forge 在各自的加载编译流程上差别很大&#xff0c;所以你很难看见有同时支持二者的 mod&#xff0c;除非做了兼容性处理 Fabri…

【Java笔记】对象存储服务MinIO

1 MinIO简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单&#xff0c;基本是复…

mac-右键-用VSCode打开

1.点击访达&#xff0c;搜索自动操作 2.选择快速操作 3.执行shell脚本 替换代码如下&#xff1a; for f in "$" doopen -a "Visual Studio Code" "$f" donecommand s保存会出现一个弹框&#xff0c;保存为“用VSCode打开” 5.使用

基于百度语音识别API智能语音识别和字幕推荐系统——深度学习算法应用(含全部工程源码)+测试数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 翻译3. 格式转换4. 音频切割5. 语音识别6. 文本切割7. main函数 系统测试工程源代码下载其它资料下载 前言 本项目基于百度语音识别API&#xff0c;结合了语音识别、视频转换音频识别以及语句停顿…

【人工智能124种任务大集合】-集齐了自然语言处理(NLP),计算机视觉(CV),语音识别,多模态等任务

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能124种任务大集合&#xff0c;任务集合主要包括4大类&#xff1a;自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、语音识别、多模态任务。 我这里整理了124种应用场景任…

JavaScript基础之基于数据类型和引用数据类型

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 数据类型 JavaScript的数据类型有7中&#xff0c;包括6个基本类型和一个引用类型 基本数据类型&#xff1a;number, string, boolean, null, undefined, symbol 引用数据类型&#xff1a;object&#xff08;数组…

工业物联网数据桥接教程:Modbus 桥接到 MQTT

Modbus 介绍 Modbus 是一种串行通信协议&#xff0c;用于连接工业自动化设备&#xff0c;最初由 Modicon 公司开发&#xff0c;诞生于 1979 年&#xff0c;现在已成为通用的通讯标准之一&#xff0c;广泛用于工业自动化场景。 Modbus 采用主从模式&#xff0c;支持多种传输方…

PyTorch深度学习实战(11)——卷积神经网络

PyTorch深度学习实战&#xff08;11&#xff09;——卷积神经网络 0. 前言1. 全连接网络的缺陷2. 卷积神经网络基本组件2.1 卷积2.2 步幅和填充2.3 池化2.3 卷积神经网络完整流程 3. 卷积和池化相比全连接网络的优势4. 使用 PyTorch 构建卷积神经网络4.1 使用 PyTorch 构建 CNN…

H5移动端附件下载

目录 H5移动端附件下载 1. 使用 window.open() 进行下载 2. 使用 a 标签创建隐藏的可下载链接 3. 使用 iframe 进行下载 4. 使用 FileSaver.js 插件下载 4.1 Vue项目中导入并使用下载附件 4.2 FileSaver.js 的其他知识 H5移动端附件下载 1. 使用 window.open() 进行下载…

ClickHouse的数据类型

1.整数型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。整型范围&#xff08;-2n-1~2n-1-1&#xff09;&#xff1a; Int8 - [-128 : 127] Int16 - [-32768 : 32767] Int32 - [-2147483648 : 2147483647] Int64 - [-9223372036854775808 : 9223372036854775807]无符…

Linux学习之sed多行模式

N将下一行加入到模式空间 D删除模式空间中的第一个字符到第一个换行符 P打印模式空间中的第一个字符到第一个换行符 doubleSpace.txt里边的内容如下&#xff1a; goo d man使用下边的命令可以实现把上边对应的内容放到doubleSpace.txt。 echo goo >> doubleSpace.txt e…

sealos安装k8s

一、前言 1、我前面文章有写过使用 kubeadm 安装的方式&#xff0c;大家可以去参考 &#xff08;二&#xff09;k8s集群安装&#xff0c;有一系列的k8s文章说明 2、安装k8s的方式有很多 kubeadmsealoskubespray等等 3、关于sealos来安装 k8s &#xff0c;也是非常建议大家去…

Idea 反编译jar包

实际项目中&#xff0c;有时候会需要更改jar包源码来达到业务需求&#xff0c;本文章将介绍一下如何通过Idea来进行jar反编译 1、Idea安装decompiler插件 2、找到decompiler插件文件夹 decompiler插件文件夹路径为&#xff1a;idea安装路径/plugins/java-decompiler/lib 3、…

可独立创建应用的SaaS多租户低代码平台之租户的应用管理说明

在IT系统中&#xff0c;“租户”&#xff08;tenant&#xff09;通常用于指代一种多租户架构&#xff08;multi-tenancy&#xff09;&#xff0c;它是一种软件架构模式&#xff0c;允许多个用户或组织共享相同的应用程序或系统实例&#xff0c;但彼此之间的数据和配置被隔离开来…

C#软件外包开发框架

C# 是一种由微软开发的多范式编程语言&#xff0c;常用于开发各种类型的应用程序&#xff0c;从桌面应用程序到移动应用程序和Web应用程序。在 C# 开发中&#xff0c;有许多框架和库可供使用&#xff0c;用于简化开发过程、提高效率并实现特定的功能。下面和大家分享一些常见的…