【Java + Vue 實現圖片上傳后 導出圖片及Excel 并壓縮為zip壓縮包】

系統環境:

Java JDK:1.8.0_202
Node.js:v12.2.0
Npm:6.9.0

Java后端實現

Controller

	/*** xxxx-導出* @param response 返回信息體* @param files 上傳的圖片文件* @param param1 參數1* @param param2 參數2*/@PostMapping("/exportXX")@ApiOperationSupport(order = 13)@ApiOperation(value = "導出Excel", notes = "導出Excel")@ApiLog("XXX導出")public void exportXX(HttpServletResponse response, @RequestParam("files") MultipartFile[] files, @RequestParam("param1") String param1,@RequestParam(value = "param2",defaultValue = "1") String param2) {tableExportService.exportXX(response, files, param1, param2);}

Service

	/*** XXX-導出*/void exportXX(HttpServletResponse response, MultipartFile[] files, String param1,String param2);

Impl

	/*** xxxx-導出* @param response 返回信息體* @param files  上傳的圖片文件* @param param1 參數1* @param param2 參數2*/@Overridepublic void exportXX(HttpServletResponse response,MultipartFile[] files,  String param1, String param2) {try {// 返回信息體重置response.reset();// 設置類型response.setContentType("application/force-download");// 賦值壓縮包名稱及頭部信息SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String fileName = "attachment;filename=cryExcel" + format.format(new Date()) + ".zip";response.setHeader("Content-Disposition", fileName);// 發送二進制數據到客戶端的輸出流ServletOutputStream servletOutputStream = response.getOutputStream();ZipOutputStream zipOut = new ZipOutputStream(servletOutputStream);// 圖片添加到ZIPaddPicToZip(files,zipOut);// 表頭List<List<String>> headList = new ArrayList<>();// 固定列headList.add(Arrays.asList("列1"));headList.add(Arrays.asList("列名2"));headList.add(Arrays.asList("這是列名3"));// 導出數據List<List<String>> dataList = new ArrayList<>();// 自行獲取需要導出為excel的數據信息List<Map<String, Object>> list = ……;// 列表不為空時按照列1進行排序if(Func.isNotEmpty(list)){list.sort(Comparator.comparing(map -> (String) map.get("列1的鍵")));}// 轉換數據格式為二維數組 方便存入excelfor (Map<String, Object> item : list) {dataList.add(Arrays.asList(String.valueOf(item.getOrDefault("列1的值", "")),String.valueOf(item.getOrDefault("列2的值", "")),String.valueOf(item.getOrDefault("列3的值", "")) + "%"));}// 導出excel 并合并第一列的相同內容int[] mergeColumeIndex = {0};int mergeRowIndex = 1;String excelName = "導出excel.xlsx";File excelfile = new File(excelName);if (!excelfile.exists()) {excelfile.createNewFile();}// 將excel寫入壓縮包EasyExcel.write(excelName).head(headList).registerWriteHandler(new ExcelFillCellLineMergeHandler(mergeRowIndex, mergeColumeIndex)).sheet("導出excel").doWrite(dataList);// 創建 ZipEntryZipEntry entry = new ZipEntry(excelName);zipOut.putNextEntry(entry);// 讀取文件并寫入 ZipOutputStreamtry (FileInputStream fis = new FileInputStream(excelfile)) {byte[] buffer = new byte[1024];int length;while ((length = fis.read(buffer)) > 0) {zipOut.write(buffer, 0, length);}}// 關閉當前的 ZipEntryzipOut.closeEntry();// 關流zipOut.close();} catch (Exception e){e.printStackTrace();}}/*** 將Base64編碼的圖片文件添加到ZIP輸出流中* @param files 包含Base64編碼的圖片的MultipartFile數組* @param zipOut 目標ZIP輸出流*/
private void addPicToZip(MultipartFile[] files, ZipOutputStream zipOut) {try {// 檢查文件數組是否為空if (files != null) {// 遍歷所有文件for (MultipartFile file : files) {// 從MultipartFile中獲取輸入流并轉換為字符串String imageData = StreamUtils.copyToString(file.getInputStream(), StandardCharsets.UTF_8);// 移除Base64數據前綴(如果存在)imageData = imageData.replace("data:image/png;base64,", "");// 解碼Base64字符串為字節數組byte[] imageBytes = Base64.getDecoder().decode(imageData);// 創建ZIP條目,使用原始文件名并添加.png擴展名ZipEntry zipEntry = new ZipEntry(file.getOriginalFilename() + ".png");// 將條目添加到ZIP輸出流zipOut.putNextEntry(zipEntry);// 寫入圖片字節數據到ZIP條目zipOut.write(imageBytes, 0, imageBytes.length);}}} catch (IOException e) {// 打印異常堆棧信息e.printStackTrace();}
}
  • 注:對于此處我個人覺得直接讓前端上傳file二進制文件更好,后端直接獲取file的字節碼,然后弄進壓縮包,此處可以根據業務需求自行調整~

Vue 前端實現

Api

/*** @description 測試導出* */
export const exportXX = (data) => {return request({headers: {"Content-Type": "multipart/form-data"// 指定請求體為多部分表單數據(用于文件上傳)},method: 'post',responseType: 'blob',// 指定響應類型為二進制大對象(用于接收文件流)data,url: 'http://localhost:8990/dev-api/tableExport/exportXX',})
}

Vue

此處可以自行選擇upload組件上傳的文件或者echarts圖形截圖等文件進行上傳

    // 上傳圖片信息async uploadImages() {try {// 創建FormDataconst formData = new FormData();if (this.selectedFiles.length !== 0) {// 處理每個文件for (const file of this.selectedFiles) {// 轉換為完整的Base64 DataURL(包含前綴)const base64DataUrl = await this.convertToBase64(file);// 創建一個Blob對象,內容為Base64字符串(作為文本)const blob = new Blob([base64DataUrl], { type: "text/plain" });// 使用原始文件名創建File對象const fileToUpload = new File([blob], file.name, {type: "text/plain",});// 添加到FormDataformData.append("files", fileToUpload);}}formData.append("param1", "111");formData.append("param2", "222");// 調用導出接口await exportXX(formData).then((res) => {console.log(formData);console.log(res);if(res){const elink = document.createElement('a');elink.download = '文件名稱.zip';elink.style.display = 'none';const blob = new Blob([res], { type: 'application/x-msdownload' });elink.href = URL.createObjectURL(blob);document.body.appendChild(elink);elink.click();document.body.removeChild(elink);}else {this.$message.error('導出異常請聯系管理員');}});console.log("上傳成功");} catch (error) {console.error("上傳錯誤:", error);}},//轉換為base64字符convertToBase64(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => resolve(reader.result); // 返回完整的DataURL(含前綴)reader.onerror = reject;reader.readAsDataURL(file);});},

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

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

相關文章

安科瑞:能源微電網助力工業園區“綠色”發展

朱以真近日&#xff0c;廈門市工業和信息化局印發工業園區綠色智慧微電網建設&#xff0c;擬開展全市工業園區綠色智慧微電網試點通知&#xff0c;那么對于如何實現綠色園區的建設是今天的話題。對工業園區綠色智慧微電網建設需求&#xff0c;其核心價值體現在“源-網-荷-儲-充…

VUE2 學習筆記3 v-on、事件修飾符、鍵盤事件

事件處理v-on用于事件交互。語法&#xff1a;v-on:要綁定的事件“事件觸發時執行的函數” &#xff08;函數這里可以寫括號&#xff0c;也可以不寫&#xff0c;沒有影響&#xff09;簡寫&#xff1a;:事件觸發時要執行的函數&#xff0c;在Vue配置參數中&#xff0c;通過method…

變換域通訊系統CCSK的matlab仿真

CCSK&#xff08;Cyclic Code Shift Keying&#xff09;通信系統的MATLAB仿真。實現完整的CCSK調制、AWGN信道傳輸和解調過程&#xff0c;并計算了誤碼率&#xff08;BER&#xff09;。 % CCSK通信系統仿真 clear; clc; close all;% 參數設置 L 31; % m序列…

技術演進中的開發沉思-40 MFC系列:多線程協作

今天說說MFC的線程&#xff0c;當年用它實現中間件消息得心應手之時&#xff0c;可以實現一邊實時接收數據&#xff0c;一邊更新界面圖表圖文信息&#xff0c;順滑得讓人想吹聲口哨。 MFC 多線程它像給程序裝上了分身術&#xff0c;讓原本只能 “單任務跑腿” 的代碼&#xff0…

高速公路自動化安全監測主要內容

近年來&#xff0c;隨著社會經濟的快速發展&#xff0c;高速公路的通車里程不斷增加&#xff0c;交通流量日益增大。與此同時&#xff0c;高速公路交通事故數量也呈現出一定的增長趨勢。這些事故不僅造成了大量的人員傷亡和財產損失&#xff0c;還嚴重影響了社會的穩定和經濟的…

完美解決 Ubuntu 中自定義啟動器圖標重復的問題(以 MATLAB 為例)

如果你在 Ubuntu 上為 MATLAB、PyCharm、Android Studio 或其他第三方應用創建了自定義啟動器&#xff0c;并把它固定到了左側的 Dock 欄&#xff0c;你很可能遇到過這個令人抓狂的場景&#xff1a; 當你滿心歡喜地點擊固定的圖標啟動程序后&#xff0c;Dock 欄上竟然“憑空”冒…

一文讀懂深度模型優化器,掌握煉丹工具

深度模型優化器是訓練神經網絡的核心工具&#xff0c;其目標是高效地找到損失函數的最小值。從基礎的隨機梯度下降&#xff08;SGD&#xff09;到結合一階動量修正與兩階段更新的Ranger&#xff0c;優化器的發展始終圍繞著加速收斂、提升穩定性、適應參數差異和增強泛化能力四大…

關于虛擬機部署的k8s集群calico組件在開機恢復快照時的問題

在恢復虛擬機開機快照的時候總會出現各種的網絡問題&#xff0c;連接不到自己的443端口&#xff0c;集群狀態異常等等&#xff0c;繞一圈都發現不了問題&#xff0c;其實根本就沒問題。虛擬機環境再現&#xff0c;恢復快照后的k8s環境&#xff0c;nfs莫名宕掉提示此報錯&#x…

從感知到決策:虛擬仿真系統與視覺算法融合下的多路RTSP視頻接入技術探究

1?? 背景概述 隨著國防信息化和智能化進程的不斷加快&#xff0c;虛擬仿真系統 與 智能視覺算法平臺 正逐步成為現代化裝備研發、測試驗證與戰術訓練的重要技術支撐。相比傳統的靜態建模或離線推演&#xff0c;新一代作戰仿真與智能系統更強調 實時性、感知能力與動態交互&a…

Android app如果不適配Android 15會怎么樣

深度思考完成 用時49秒 首先&#xff0c;用戶的問題是&#xff1a;“Android app如果不適配Android 15會怎么樣&#xff1f;”我需要基于搜索結果來回答。 讓我回顧搜索結果&#xff1a; ?1&#xff1a;標題是“Android 15應用適配指南”&#xff0c;內容強調了不適配Androi…

Vue-21-利用Vue3的axios+Python的flask實現前后端交互功能

文章目錄 1 任務需求 2 前端 2.1 模板template 2.2 JS代碼script 2.3 Calculate.vue(子組件) 2.4 App.vue(根組件) 3 后端 3.1 導入模塊 3.2 創建應用實例 3.3 配置CORS 3.4 定義路由 3.5 處理請求 3.6 main.py 4 附錄 4.1 CORS 4.1.1 全局啟用CORS 4.1.2 限制允許的域名(更安…

動態規劃之最長回文子串

題目&#xff1a;最長回文子串 給你一個字符串 s&#xff0c;找到 s 中最長的 回文 子串。 示例 1&#xff1a; 輸入&#xff1a;s “babad” 輸出&#xff1a;“bab” 解釋&#xff1a;“aba” 同樣是符合題意的答案。 示例 2&#xff1a; 輸入&#xff1a;s “cbbd” 輸…

Linux 編程中的錯誤處理機制詳解 —— `errno` 全解析

文章目錄Linux 編程中的錯誤處理機制詳解 —— errno 全解析一、什么是 errno&#xff1f;?為什么需要 errno&#xff1f;? 它在哪里定義&#xff1f;二、errno 的設置與讀取規則?? errno 不是總是有效&#xff01;?使用 errno 的正確步驟&#xff1a;三、與 errno 配套使…

力扣-最長遞增子序列

簡單記錄學習~給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。示例…

公司內部網址怎么在外網打開?如何讓外網訪問內網的網站呢?

很多公司內部本地會部署有中小型的服務器&#xff0c;可以很好的方便用于一些辦公業務系統&#xff0c;或測試開發需要。在數字化辦公和生活場景中&#xff0c;除了公司內部局域網內訪問公司系統外&#xff0c;經常會遇到需要讓外網訪問內網網站的情況。比如企業員工遠程辦公時…

有趣的css - 多選立體標簽按鈕

&#x1f36d; 大家好&#xff0c;我是 Just&#xff0c;這里是「設計師工作日常」&#xff0c;今天分享的是一個交互較完整的多選立體標簽按鈕。 最新文章通過公眾號「設計師工作日常」發布。 目錄整體效果核心代碼html 代碼css 部分代碼完整代碼如下html 頁面css 樣式頁面渲…

C++中byte*和char*的區別

在C中&#xff0c;byte*&#xff08;通常指 std::byte*&#xff09;和 char* 都是指針類型&#xff0c;但它們在語義和用途上有重要區別&#xff1a;1. 類型定義char* char 是C內置的基本類型&#xff0c;表示字符&#xff08;通常是1字節&#xff09;。 char* 常用于&#xff…

【node】npm包本地開發與調試

npm link 進入本地的 babel-plugin-function-try-catch 這個 npm 包的根目錄執行&#xff1a; npm link上面的命令可以將當前的這個包安裝在全局&#xff08;mac 中的路徑是 /usr/local/bin&#xff09;&#xff0c;也就是 npm i -g 安裝包的目錄。 執行后結果如圖&#xff…

突破量子仿真瓶頸:微算法科技MLGO量子算法的算術化與核操作迭代模型

近年來&#xff0c;量子計算機的迅速發展和潛在的強大計算能力吸引了全球科研機構和企業的廣泛關注。量子計算機利用量子力學的特性來處理復雜的計算任務&#xff0c;具有在某些方面遠超經典計算機的潛力。然而&#xff0c;真正實用的量子計算機尚未大規模普及&#xff0c;因此…

python中讀取 Excel 表格數據

在pandas中讀取 Excel 表格后&#xff0c;有多種方式可以按列、按行提取數據&#xff0c;下面我將詳細介紹常見的方法。 0.聲明 在本文中我使用的excel表內容如下&#xff1a;1. 讀取 Excel 文件 首先&#xff0c;我們需要使用 pandas 的 read_excel 函數讀取 Excel 文件&#…