如何在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.pswp.cn/news/35906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35906.shtml
英文地址,請注明出處:http://en.pswp.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;用于簡化開發過程、提高效率并實現特定的功能。下面和大家分享一些常見的…