Springboot將多個圖片導出成zip壓縮包

Springboot將多個圖片導出成zip壓縮包

將多個圖片導出成zip壓縮包

/*** 判斷時間差是否超過6小時* @param startTime 開始時間* @param endTime 結束時間* @return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定義日期時間格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 將字符串轉換為 LocalDateTimeLocalDateTime startDateTime = LocalDateTime.parse(startTime,formatter);LocalDateTime endDateTime = LocalDateTime.parse(endTime,formatter);// 檢查兩個時間之間的時間差long hoursDifference = ChronoUnit.SECONDS.between(startDateTime, endDateTime);// 如果小時差小于等于6小時,則符合條件return hoursDifference <= 6 * 60 * 60;}/*** 批量下載上傳的圖片** @param startTime 開始時間* @param endTime   結束時間*/public void batchDownloadUploadPhoto(String startTime, String endTime,String fieldId,String unitTypeId,Integer unitNo,Integer termAddr, HttpServletResponse response, HttpServletRequest request) {if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {throw new DataValidateErrorException("請先傳遞時間在批量導出!");}if (!startTime.contains(":") || !endTime.contains(":")) {throw new DataValidateErrorException("請傳遞時分秒");}//相隔時間不得超過6小時if(!isWithin6Hours(startTime,endTime)){//大于6小時,拋出異常throw new DataValidateErrorException("導出的時間范圍不得超過6小時!");}//查詢導出圖片urlList<ChuteImageAddress> addressList = chuteImageAddressService.selectUploadPhoto(startTime, endTime, fieldId, unitTypeId, unitNo, termAddr);//沒有數據時,拋出異常if(CollectionUtils.isEmpty(addressList)){throw new DataValidateErrorException("無數據導出!");}DownloadByteArray downloadByteArray = new DownloadByteArray();// 創建臨時文件File zipFile = null;FileInputStream fis = null;BufferedInputStream buff = null;ZipOutputStream zos = null;CheckedOutputStream cos = null;FileOutputStream fot = null;ServletOutputStream os = null;try {//臨時文件名稱zipFile = File.createTempFile("" + System.currentTimeMillis(), ".zip");fot = new FileOutputStream(zipFile);// 為任何OutputStream產生校驗,第一個參數是制定產生校驗和的輸出流,第二個參數是指定Checksum的類型 (Adler32(較快)和CRC32兩種)cos = new CheckedOutputStream(fot, new Adler32());// 用于將數據壓縮成Zip文件格式zos = new ZipOutputStream(cos);String[] files = new String[addressList.size()];List<String> list = addressList.stream().map(ChuteImageAddress::getImgUrl).collect(Collectors.toList());list.toArray(files);for (int i = 0; i < files.length; i++) {String file = files[i];zos.putNextEntry(new ZipEntry(addressList.get(i).getImgName()));StorePath storePath = StorePath.praseFromUrl(file);byte[] fileBytes = client.downloadFile(storePath.getGroup(), storePath.getPath(), downloadByteArray);zos.write(fileBytes);}os = response.getOutputStream();//下載文件,使用spring框架中的FileCopyUtils工具response.setCharacterEncoding("GB2312");response.setContentType(request.getSession().getServletContext().getMimeType(UUIDUtil.create()));//設置響應頭,attachment表示以附件的形式下載,inline表示在線打開response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode("批量下載.zip", "UTF-8"));fis = new FileInputStream(zipFile);buff = new BufferedInputStream(fis);FileCopyUtils.copy(buff, os);} catch (Exception e) {log.error("【批量下載圖片出現異常】異常原因" + e.getMessage());} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}if (fot != null) {try {fot.close();} catch (IOException e) {e.printStackTrace();}}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (buff != null) {try {buff.close();} catch (IOException e) {e.printStackTrace();}}}}

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】—搜索二叉樹(C++實現,超詳細!)

&#x1f3ac;慕斯主頁&#xff1a;修仙—別有洞天 ??今日夜電波&#xff1a;消えてしまいそうです—真夜中 1:15━━━━━━?&#x1f49f;──────── 4:18 &#x1f504; ?? ? ??…

函數計算的新征程:使用 Laf 構建 AI 知識庫

Laf 已成功上架 Sealos 模板市場&#xff0c;可通過 Laf 應用模板來一鍵部署&#xff01; 這意味著 Laf 在私有化部署上的擴展性得到了極大的提升。 Sealos 作為一個功能強大的云操作系統&#xff0c;能夠秒級創建多種高可用數據庫&#xff0c;如 MySQL、PostgreSQL、MongoDB …

js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj,將數組中的內容作為對象的key轉化為對象,對應的值轉換為對象對應的值

1.需求場景 哈嘍 大家好啊&#xff0c;今天遇到一個場景&#xff0c; js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj&#xff0c;將數組中的內容作為對象的key轉化為對象&#xff0c;對應的值轉換為對象對應的值 數組對象中某個屬性的值&#xff0c;轉…

元宇宙現已開放!

在 2023 年 11 月 3 日 The Sandbox 首個全球創作者日上&#xff0c;The Sandbox 聯合創始人 Arthur Madrid 和 Sebastien Borget 宣布元宇宙已開放&#xff0c;已創作完整體驗的 LAND 持有者可以自行將體驗發布至 The Sandbox 地圖上。 精選速覽 LAND 持有者&#xff1a;如果…

在JVM中 判定哪些對象是垃圾?

目錄 垃圾的條件 1、引用計數法 2、可達性分析 3、強引用 4、軟引用 5、弱引用 6、虛引用 判斷垃圾的條件 在Java虛擬機&#xff08;JVM&#xff09;中&#xff0c;垃圾收集器負責管理內存&#xff0c;其中的垃圾收集算法用于確定哪些對象是垃圾&#xff0c;可以被回收…

VBA即用型代碼手冊之工作薄的關閉保存及創建

我給VBA下的定義&#xff1a;VBA是個人小型自動化處理的有效工具。可以大大提高自己的勞動效率&#xff0c;而且可以提高數據的準確性。我這里專注VBA,將我多年的經驗匯集在VBA系列九套教程中。 作為我的學員要利用我的積木編程思想&#xff0c;積木編程最重要的是積木如何搭建…

[Latex] Riemann 問題中的激波,接觸間斷,膨脹波的 Tikz 繪圖

Latex 代碼 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定義組件學習

文章目錄 創建自定義組件頁面和自定義組件生命周期自定義組件和頁面的區別頁面生命周期(即被Entry修飾的組件)組件生命周期(即被Component修飾的組件) Builder裝飾器&#xff1a;自定義構建函數按引用傳遞參數按值傳遞參數 BuilderParam裝飾器&#xff1a;引用Builder函數 這個…

Python 將列表拼接為一個字符串,Python join

目錄 join方法的源碼&#xff1a; 列表數據為字符串 列表數據為數字 三引號也可以使用join join方法的源碼&#xff1a; def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos應用開發者高級認證考試部分答案

1只要使用端云一體化的云端資源就需要支付費用&#xff08;錯&#xff09; 2所有使用Component修飾的自定義組件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期函數。&#xff08;錯&#xff09; 3 HarmonyOS應用可以兼容OpenHarmony生態&#xff08;對&#…

一文讀懂如何安全地存儲密碼

目錄 引言 明文存儲 基本哈希存儲 加鹽哈希存儲 適應性哈希算法 密碼加密存儲 小結 引言 密碼是最常用的身份驗證手段&#xff0c;既簡單又高效。密碼安全是網絡安全的基石&#xff0c;對保護個人和組織信息的安全具有根本性的作用。然而有關密碼泄漏的安全問題一再發生…

生物動力葡萄酒和有機葡萄酒一樣嗎?

農業維持了數十萬年的文明&#xff0c;但當人類以錯誤的方式過多干預&#xff0c;過于專注于制造和操縱產品時&#xff0c;農業往往會失敗。如果我們的目標是獲得最高質量的收成&#xff0c;并長期堅持我們的做法&#xff0c;我們就必須與土地打交道。 當我們開始尋找生物動力…

應用內測分發平臺如何上傳應用包體?

●您可免費將您的應用&#xff08;支持蘋果.ios安卓.apk文件&#xff09;上傳至咕嚕分發平臺&#xff0c;我們將免費為應用生成下載信息&#xff0c;但咕嚕分發將會對應用的下載次數進行收費&#xff08;每個賬號都享有免費贈送的下載點數以及參加活動的贈送點數&#xff09;&a…

UVA1025 城市里的間諜 A Spy in the Metro

UVA1025 城市里的間諜 A Spy in the Metro 題面翻譯 題目大意 某城市地鐵是一條直線&#xff0c;有 n n n&#xff08; 2 ≤ n ≤ 50 2\leq n\leq 50 2≤n≤50&#xff09;個車站&#xff0c;從左到右編號 1 … n 1\ldots n 1…n。有 M 1 M_1 M1? 輛列車從第 1 1 1 站開…

【電路筆記】-分壓器

分壓器 文章目錄 分壓器1、概述2、負載分壓器3、分壓器網絡4、無功分壓器4.1 電容分壓器4.2 感應分壓器 5、總結 有時&#xff0c;需要精確的電壓值作為參考&#xff0c;或者僅在需要較少功率的電路的特定階段之前需要。 分壓器是解決此問題的一個簡單方法&#xff0c;因為它們…

【Vue】filter的用法

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

在vscode下將ipynb文件轉成pdf的方法

正常情況下&#xff0c;可以在vscode的ipynb界面點擊上面的三個點&#xff0c;里面有export&#xff0c;可以選擇直接輸出html和pdf&#xff0c;但是需要latex&#xff0c;由于按扎u安裝麻煩&#xff0c;所以我換了一種方法。 ----------------------------------------------…

記一次docker服務啟動失敗解決過程

環境&#xff1a;centos 7.6 報錯&#xff1a;start request repeated too quickly for docker.service 由于服務器修復了內核漏洞&#xff0c;需要重啟&#xff0c;沒想到重啟后&#xff0c;docker啟動失敗了 查看狀態 systemctl status docker如下圖 里面有一行提示&…

網絡互聯與IP地址

目錄 網絡互聯概述網絡的定義與分類網絡的定義網絡的分類 OSI模型和DoD模型網絡拓撲結構總線型拓撲結構星型拓撲結構環型拓撲結構 傳輸介質同軸電纜雙絞線光纖 介質訪問控制方式CSMA/CD令牌 網絡設備網卡集線器交換機路由器總結 IP地址A、B、C類IP地址特殊地址形式 子網與子網掩…

[NOIP2013 提高組] 積木大賽

Description 春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內容是搭建一座寬度為 n 的大廈&#xff0c;大廈可以看成由 n 塊寬度為 1 的積木組成&#xff0c;第 i 塊積木的最終高度需要是 hi?。 在搭建開始之前&#xff0c;沒有任何積木&#xff08;可以看成 n 塊高度…