前端文件下載常用方式詳解

在這里插入圖片描述

在前端開發中,實現文件下載是常見的需求。根據不同的場景,我們可以選擇不同的方法來實現文件流的下載。本文介紹三種常用的文件下載方式:

  • 使用 axios 發送 JSON 請求下載文件流
  • 使用 axios 發送 FormData 請求下載文件流
  • 使用原生 form 表單提交下載文件流

一、使用 Axios 下載文件流(JSON 格式參數)

? 適用場景:

適用于需要通過 POST 請求發送 JSON 數據給后端以獲取文件流的情況。

?? 注意事項:

  • 設置 responseType: 'blob'
  • 使用 Blob 對象處理響應數據。
  • 動態獲取文件名需依賴 Content-Disposition 頭部字段,部分瀏覽器可能不支持,需服務器配置允許跨域訪問該頭部。

🧩 示例代碼:

axios({url: 'https://localhost/download/test',method: 'post',data: {headers: ["姓名", "年齡", "城市"],data: [{"姓名": "張三","年齡": 25,"城市": "北京"}],fileName: "99"},responseType: 'blob',withCredentials: true
}).then(response => {// 獲取文件名let filename = '默認文件.xlsx';const disposition = response.headers['content-disposition'];if (disposition && disposition.indexOf('filename=') !== -1) {filename = disposition.split('filename=')[1].replace(/"/g, '');try {filename = decodeURIComponent(filename);} catch (e) {filename = unescape(filename);}}// 創建 Blob 并觸發下載const blob = new Blob([response.data], { type: response.headers['content-type'] });const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = filename;document.body.appendChild(link);link.click();window.URL.revokeObjectURL(url);document.body.removeChild(link);
});

二、使用 Axios 下載文件流(FormData 格式參數)

? 適用場景:

適用于需要傳遞鍵值對形式的數據(如上傳文件)或模擬表單提交的場景。

?? 注意事項:

  • 設置請求頭為 'application/x-www-form-urlencoded'
  • 使用 FormData 構造請求體。
  • 同樣需要處理動態文件名。

🧩 示例代碼:

const formData = new FormData();
formData.append("key", "value");axios({url: 'http://localhost/api/download',method: 'post',data: formData,headers: {'Content-Type': 'application/x-www-form-urlencoded'},responseType: 'blob',withCredentials: true
}).then(response => {const disposition = response.headers['content-disposition'];let filename = '默認文件.xlsx';if (disposition && disposition.includes('filename=')) {filename = disposition.split('filename=')[1].replace(/"/g, '');try {filename = decodeURIComponent(filename);} catch (e) {filename = unescape(filename);}}const blob = new Blob([response.data], { type: response.headers['content-type'] });const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = filename;document.body.appendChild(link);link.click();window.URL.revokeObjectURL(url);document.body.removeChild(link);
});

三、使用原生 Form 表單提交下載文件流

? 適用場景:

適用于不需要 JavaScript 控制、直接通過表單提交參數并由后端返回文件流的場景。

?? 注意事項:

  • 需要手動創建隱藏的 <form> 元素。
  • 不適合處理 Blob 文件流(無法控制下載行為)。
  • 不支持異步操作,頁面會跳轉。

🧩 示例代碼:

const paraData = { id: 1212, name: '測試名' };
const formActionUrl = gateUrl + '/api/dictData/downloadDictDataList';const form = document.createElement('form');
form.style.display = 'none';
form.action = formActionUrl;
form.method = 'post';
form.enctype = 'application/x-www-form-urlencoded'; // 可選document.body.appendChild(form);for (let key in paraData) {if (paraData.hasOwnProperty(key)) {const input = document.createElement('input');input.type = 'hidden';input.name = key;input.value = paraData[key];form.appendChild(input);}
}form.submit(); // 提交表單
form.remove(); // 移除表單

? 總結對比

方法是否支持 JSON是否支持文件下載是否支持動態文件名是否異步是否推薦
Axios + JSON???(依賴響應頭)?? 推薦
Axios + FormData?(自動轉換)???? 推薦
原生 Form?????? 視情況

🔁 補充建議

  1. 封裝統一下載工具函數:將通用邏輯提取成工具函數,提高復用性。
  2. 兼容中文文件名:建議后端統一使用 UTF-8 編碼文件名,避免前端解析困難。
  3. 錯誤處理增強:添加 .catch() 捕獲異常并提示用戶。
  4. 取消請求機制:對于大文件或長時間請求,可考慮加入取消功能(如 CancelTokenAbortController)。
    在這里插入圖片描述

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

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

相關文章

MacOS解決局域網“沒有到達主機的路由 no route to host“

可能原因&#xff1a;MacOS 15新增了"本地網絡"訪問權限&#xff0c;在 APP 第一次嘗試訪問本地網絡的時候會請求權限&#xff0c;可能順手選擇了關閉。 解決辦法&#xff1a;給想要訪問本地網絡的 APP &#xff08;例如 terminal、Navicat、Ftp&#xff09;添加訪問…

中英文實習證明模板:一鍵生成標準化實習證明,助力實習生職場發展

中英文實習證明模板&#xff1a;一鍵生成標準化實習證明&#xff0c;助力實習生職場發展 【下載地址】中英文實習證明模板 這份中英文實習證明模板專為實習生設計&#xff0c;內容簡潔專業&#xff0c;適用于多種場景。模板采用中英文對照格式&#xff0c;方便國際交流與使用。…

RocketMQ運行架構和消息模型

運?架構 nameServer 命名服務 NameServer 是 RocketMQ 的 輕量級注冊中心&#xff0c;負責管理集群的路由信息&#xff08;Broker 地址、Topic 隊列分布等&#xff09;&#xff0c;其核心作用是解耦 Broker 與客戶端&#xff0c;實現動態服務發現。broker 核?服務 RocketMQ最…

C++學習-入門到精通【11】輸入/輸出流的深入剖析

C學習-入門到精通【11】輸入/輸出流的深入剖析 目錄 C學習-入門到精通【11】輸入/輸出流的深入剖析一、流1.傳統流和標準流2.iostream庫的頭文件3.輸入/輸出流的類的對象 二、輸出流1.char* 變量的輸出2.使用成員函數put進行字符輸出 三、輸入流1.get和getline成員函數2.istrea…

OpenCV 圖像像素的邏輯操作

一、知識點 1、圖像像素的邏輯操作&#xff0c;指的是位操作bitwise&#xff0c;與、或、非、異或等。 2、位操作簡介: 位1 位2 與and 或or 異或xor0 0 0 0 00 1 0 1 11 0 0 …

【AAOS】【源碼分析】用戶管理(二)-- 整體架構

整體介紹 Android多用戶功能作為 Android Automotive 的重要組成部分,為不同駕駛員和乘客提供了一個更加定制化、隱私保護的使用環境。Android 多用戶的存在,它可以讓多個用戶使用同一臺設備,同時保持彼此的數據、應用和設置分隔開來。 各用戶類型的權限 能力SystemAdminS…

Redis最佳實踐——電商應用的性能監控與告警體系設計詳解

Redis 在電商應用的性能監控與告警體系設計 一、原子級監控指標深度拆解 1. 內存維度監控 核心指標&#xff1a; # 實時內存組成分析&#xff08;單位字節&#xff09; used_memory: 物理內存總量 used_memory_dataset: 數據集占用量 used_memory_overhead: 管理開銷內存 us…

多模態大語言模型arxiv論文略讀(109)

Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ?? 論文標題&#xff1a;Math-PUMA: Progressive Upward Multimodal Alignment to Enhance Mathematical Reasoning ?? 論文作者&#xff1a;Wenwen Zhuang, Xin Huang, Xiantao Z…

web3-以太坊智能合約基礎(理解智能合約Solidity)

以太坊智能合約基礎&#xff08;理解智能合約/Solidity&#xff09; 無需編程經驗&#xff0c;也可以幫助你了解Solidity獨特的部分&#xff1b;如果本身就有相應的編程經驗如java&#xff0c;python等那么學起來也會非常的輕松 一、Solidity和EVM字節碼 實際上以太坊鏈上儲存…

D2-基于本地Ollama模型的多輪問答系統

本程序是一個基于 Gradio 和 Ollama API 構建的支持多輪對話的寫作助手。相較于上一版本&#xff0c;本版本新增了對話歷史記錄、Token 計數、參數調節和清空對話功能&#xff0c;顯著提升了用戶體驗和交互靈活性。 程序通過抽象基類 LLMAgent 實現模塊化設計&#xff0c;當前…

傳統業務對接AI-AI編程框架-Rasa的業務應用實戰(2)--選定Python環境 安裝rasa并初始化工程

此篇接續上一篇 傳統業務對接AI-AI編程框架-Rasa的業務應用實戰&#xff08;1&#xff09;--項目背景即學習初衷 1、Python 環境版本的選擇 我主機上默認的Python環境是3.12.3 &#xff08;我喜歡保持使用最新版本的工具或框架&#xff0c;當初裝python時最新的穩定版本就是…

Ubuntu22.04安裝MinkowskiEngine

MinkowskiEngine簡介 Minkowski引擎是一個用于稀疏張量的自動微分庫。它支持所有標準神經網絡層&#xff0c;例如對稀疏張量的卷積、池化和廣播操作。 MinkowskiEngine安裝 官方源碼鏈接&#xff1a;GitHub - NVIDIA/MinkowskiEngine: Minkowski Engine is an auto-diff neu…

高等數學基礎(矩陣基本操作轉置和逆矩陣)

矩陣是否相等 若 A A A和 B B B為同型矩陣且對應位置的各個元素相同, 則稱矩陣 A A A和 B B B相等 在Numpy中, 可以根據np.allclose()來判斷 import numpy as npA np.random.rand(4, 4) # 生成一個隨機 n x n 矩陣B A A.Tprint("矩陣是否相等&#xff1a;", np…

網絡爬蟲一課一得

網頁爬蟲&#xff08;Web Crawler&#xff09;是一種自動化程序&#xff0c;通過模擬人類瀏覽行為&#xff0c;從互聯網上抓取、解析和存儲網頁數據。其核心作用是高效獲取并結構化網絡信息&#xff0c;為后續分析和應用提供數據基礎。以下是其詳細作用和用途方向&#xff1a; …

MATLAB實現井字棋

一、智能決策系統與博弈游戲概述 &#xff08;一&#xff09;智能決策系統核心概念 智能決策系統&#xff08;Intelligent Decision System, IDS&#xff09;是通過數據驅動和算法模型模擬人類決策過程的計算機系統&#xff0c;核心目標是在復雜環境中自動生成最優策略&#…

解決el-select選擇框右側下拉箭頭遮擋文字問題

如圖所示&#xff1a; el-select長度較短的時候&#xff0c;選擇框右側下拉箭頭會遮擋選中的數據 選中數據被遮擋 解決辦法&#xff1a; 組件如下&#xff1a; <td class"fmtd" :colspan"col.ptproCupNum" v-for"col in row" :key"…

【Linux】pthread多線程同步

參考文章&#xff1a;https://blog.csdn.net/Alkaid2000/article/details/128121066 一、線程同步 線程的主要優勢在于&#xff0c;能夠通過全局變量來共享信息。不過&#xff0c;這種便攜的共享是有代價的&#xff1b;必須確保多個線程不會同時修改同一變量&#xff0c;或者某…

Spring框架學習day7--SpringWeb學習(概念與搭建配置)

SpringWeb1.SpringWeb特點2.SpringWeb運行流程3.SpringWeb組件4.搭建項目結構圖&#xff1a;4.1導入jar包4.2在Web.xml配置**4.2.1配置統一攔截分發器 DispatcherServlet**4.2.2開啟SpringWeb注解&#xff08;spring.xml&#xff09; 5.處理類的搭建6.SpringWeb請求流程(自己理…

業務到解決方案構想

解決方案構想的核心理解 解決方案構想是連接業務需求與技術實現的關鍵橋梁&#xff0c;從您描述的內容和我的理解&#xff0c;這個階段的核心點包括&#xff1a; 核心要點解讀 轉化視角&#xff1a;將業務視角的需求轉變為解決方案視角 業務能力探索階段識別了"做什么&q…

jvm學習第1day jvm簡介,棧溢出、堆溢出

jvm學習第1day jvm簡介&#xff0c;棧溢出、堆溢出 jvm簡介棧線程安全棧溢出線程運行診斷堆堆溢出 方法區方法區內存溢出常量池和運行時常量池 jvm簡介 jvm 是編譯后的字節碼文件運行的環境&#xff0c; 因此各個平臺有了jvm可以運行java.class文件&#xff0c;這是Java跨平臺…