Springboot_文件下載功能(前端后端)

遇到的問題:

  • 文件下載后文件一直被破壞,無法正常打開
  • 文件名亂碼,如圖
    在這里插入圖片描述

剛開始一直在糾結,是不是后端沒有寫對,然后導致下載不能使用

后來搜索了一些資料,發現后端沒什么問題

然后就開始找到其他項目對比下載功能

哈哈哈哈哈哈哈

不會也只能靠這個方法去找問題了,就是有點笨,但總歸找到了問題所在

下載功能后端代碼

    @GetMapping("/annex")public void downloadAnnex(ProcessFindReqVo processFindReqVo, HttpServletResponse response) throws IOException, HttpMediaTypeNotAcceptableException {String filePath = "文件路徑"; // 指定文件路徑if (StringUtils.isBlank(filePath)) {return;}File file = new File(filePath);if (!file.exists()) {return;}response.setCharacterEncoding("utf-8");response.setContentType("application/octet-stream;charset=UTF-8");String fileName = URLEncoder.encode(file.getName(), StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");response.addHeader("Content-Disposition", "attachment;filename=" + fileName);byte[] buffer = new byte[(int)file.length()];FileInputStream fis = null;OutputStream os = null;try {fis = new FileInputStream(file);os = response.getOutputStream();int i = -1;while ((i = fis.read(buffer)) != -1) {os.write(buffer, 0, i);}} catch (IOException ex) {ex.printStackTrace();} finally {if (os != null) {try {os.flush();os.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}

下載功能前端代碼

export async function downloadAnnex(data){const res = await axios.get(`/scm/web/monthly/download/annex?id=`+data, {responseType: 'blob'})const content = res.dataconst blob = new Blob([content], { type: 'application/octet-stream' })const contentDispositionHeader = res.headers['content-disposition'];const fileName = contentDispositionHeader.split(';').map(item => item.trim()).find(item => item.startsWith('filename=')).substr('filename='.length);let decodeName = decodeURI(fileName);if ('download' in document.createElement('a')) { // 非IE下載const elink = document.createElement('a')elink.download = decodeNameelink.style.display = 'none'elink.href = URL.createObjectURL(blob)document.body.appendChild(elink)elink.click()URL.revokeObjectURL(elink.href) // 釋放URL 對象document.body.removeChild(elink)} else { // IE10+下載navigator.msSaveBlob(blob, decodeName)}
}
  • 說回剛開始的問題,下載時文件始終提示被破壞的原因:
    export async function downloadAnnex(data){這里應該使用async關鍵字
    const res = await axios.get請求時也應該使用await關鍵字,這樣就可以使文件順利下載,至于為什么還沒有深究。。。(想以后研究,不知道以后還能不能想起來了😅)
  • 文件名始終亂碼,就使用decodeURI(fileName);進行解碼,之后就可以正確的展示中文字符了,前提時后端傳輸時已經設置了UTF-8的編碼

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

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

相關文章

頭發的方向圖(2D和3D)與合成

首先,我們從一個不受光照限制的環境中拍攝一組輸入圖像,這些圖像包含了頭發的不同視角和姿態。我們對這些圖像進行半自動的分割,將頭發從背景中分離出來,然后使用PMVS ,一種先進的多視角立體算法,來重建一個…

Qt 問題 判斷QTreeWidget的子節點的父節點是否可見

bool JudgeParentItemVisible(QTreeWidgetItem * pLayerItem) {bool bVisible true;QTreeWidgetItem * pParentItem (QTreeWidgetItem *)pLayerItem->parent(); //獲取父節點if (pParentItem ! NULL) //父節點不為空{if (pParentItem->checkState(0) Qt::CheckState::…

廣播組播、本地套接字通信、wireshark、以太網幀格式、三次握手四次揮手

廣播(使用 UDP 套接字) 廣播地址:主機號最大的地址。 廣播:給所在局域網的所有主機發送數據報。(之前的數據報發送方式是單播。) 以下情況中使用廣播: 局域網 搜索協議。 比如家中的智能產品&a…

局域網共享打印機共享,簡單至簡至一鍵處理011bDll等問題

一、電腦系統是否激活(可選) 二、確保主客戶端PC在同一局域網內(可選) 可以通過ping 目標地址 如ping 192.168.1.202;看是否可以正常通信 下面是惠普類型打印機共享問題關鍵(文本記得保存) …

Redisson 分布式鎖的最佳實踐

Redisson 分布式鎖的最佳實踐 第一、添加依賴第二、添加redisson配置類第三、添加測試類測試結果擴展知識redisson鎖中lock方法和tryLock方法有什么區別鎖續約 注意事項 引言 在現代分布式系統中,處理并發問題是至關重要的。分布式鎖是解決這類問題的關鍵工具之一。…

雙11再創新高!家電行業如何通過矩陣管理,賦能品牌增長?

雙11大促已落下帷幕,雖然今年不再戰報滿天飛,但從公布的數據來看,家電行業整體表現不俗。 根據抖音電商品牌業務發布的收官戰報,家電行業創造了成交新紀錄,整體同比增長125%。快手官方數據顯示,消電家居行業…

深入理解JMM以及并發三大特性(1)

文章目錄 1. 并發與并行2. JMM3. 并發三大特性4.總結 1. 并發與并行 并行:指在同一時刻,有多條指令在多個處理器上同時執行。所以無論從微觀還是宏觀來看,二者都是一起執行的。 并發:指在同一時刻只能有一個指令執行,…

基于springboot實現校園在線拍賣系統項目【項目源碼】

基于springboot實現校園在線拍賣系統演示 Javar技術 JavaScript是一種網絡腳本語言,廣泛運用于web應用開發,可以用來添加網頁的格式動態效果,該語言不用進行預編譯就直接運行,可以直接嵌入HTML語言中,寫成js語言&…

java開發中各個環境的適用場景

java開發中各個環境的適用場景 一.開發環境 在系統開發的經典模型,一般會分成 2 類 5 種環境: 【線下】本地環境(local)、開發環境(dev)、測試環境(test) 【線上】預發布環境(stage)、生產環境(prod) 每個環境、每個項目使用獨立的二級域名 線下、線…

Modbus轉Profinet改變局面,PLC與電力儀表秒級響應

Modbus轉Profinet改變了傳統的局面,實現了PLC與電力儀表之間的秒級響應。在過去,由于Modbus通信協議的限制,PLC與電力儀表之間的數據傳輸速度受到了很大的限制,無法滿足工業自動化領域對實時性的要求。然而,隨著Modbus…

【云原生 Prometheus篇】Prometheus架構詳解與核心組件的應用實例(Exporters、Grafana...)

Prometheus Part1 一、常用的監控系統1.1 簡介1.2 Prometheus和zabbix的區別 二、Prometheus2.1 簡介2.2 Prometheus的主要組件1)Prometheus server2)Exporters3)Alertmanager4)Pushgateway5)Grafana 2.3 Prometheus的…

openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數

文章目錄 openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數130.1 背景信息130.2 GUC參數設置130.3 操作步驟130.4 示例 openGauss學習筆記-130 openGauss 數據庫管理-參數設置-重設參數 130.1 背景信息 openGauss提供了多種修改GUC參數的方法,用戶可…

【網絡】數據鏈路層協議

數據鏈路層協議 一、鏈路層解決的問題二、以太網協議1、局域網技術2、令牌環網(了解)3、以太網通信原理4、 MAC地址5、以太網幀格式6、碰撞避免7、最大傳輸單元MTU 二、ARP協議1、ARP數據的格式2、ARP協議的工作流程3、ARP緩存表4、ARP協議中的一些問題7…

11月23日星期四今日早報簡報微語報早讀

11月23日星期四,農歷十月十一,早報微語早讀。 1、我國5G基站總數達321.5萬個; 2、2023年兩院院士增選結果揭曉,共133人當選; 3、北京低保標準提升至每人每月1395元; 4、上海制定體育發展條例&#xff1a…

多重背包問題的優化 學習筆記 AcWing 5. 多重背包問題 II(算法基礎課)

乘法原理 百度百科 乘法原理是說把多個步驟的所有方法相乘,表示整個事件所有可能的解決方法 原題 有 N� 種物品和一個容量是 V� 的背包。 第 i� 種物品最多有 si�� 件,每件體積是 vi&#…

程序員必讀!深入解析Java線程調度算法神秘面紗!

哈嘍大家好,我是小米!今天我們要聊的話題是關于Java中的線程調度算法。這可是一個技術大拿們在面試時常常拿出來考察我們的點子呢!廢話不多說,讓我們一起深入了解一下吧! 線程調度算法的背后 首先,讓我們…

[Linux] shell腳本之循環

一、循環定義 一組被重復執行的語句稱之為 循環體,能否繼續重復,決定循環的終止條件。 循環語句 是由循環體及循環的終止條件兩部分組成的。 二、for循環 2.1 帶列表循環 語法 for 變量名 in 取值列表do 命令序列 done 花括號用法: 花括號{ }和seq在for循環…

設計模式——狀態模式介紹

狀態模式是一種行為設計模式,它允許對象在內部狀態改變時改變它的行為。它基于對象的內部狀態而改變其行為,看起來好像修改了對象的類。 狀態模式的關鍵組件有三個:上下文(Context)、狀態(State)和具體狀態(Concrete State)。 下面是一個例…

年輕有為!2023兩院院士增選揭榜 45歲顏寧當選

大家好,我是極智視界,歡迎關注我的公眾號,獲取我的更多前沿科技分享 邀您加入我的知識星球「極智視界」,星球內有超多好玩的項目實戰源碼和資源下載,鏈接:https://t.zsxq.com/0aiNxERDq 通常,兩…

電商網站選擇云服務器要考慮什么?

極高的安全性 交易平臺最重要的是數據安全,這涉及到產品、用戶、平臺信息等,能夠保護數據隱私的安全,是網站交易的首要原則。 2020年,數據泄露、網絡滲透、大量數據被銷售、勒索軟件爆發......每個網站都可能成為黑客的目標&#…