前端如何下載 ‘Content-Type‘: ‘application/octet-stream‘ 的文件

前言

在前端開發中,經常會遇到需要從后端接口下載文件的需求。當后端返回的響應頭中 Content-Typeapplication/octet-stream 時,表示這是一個二進制流文件,瀏覽器無法直接展示,需要前端處理后下載到本地。本文將詳細介紹前端處理這種文件下載的幾種方法及注意事項。

基本實現原理

application/octet-stream 是應用程序文件的默認值,表示未知的應用程序文件類型。瀏覽器遇到這種類型時,會將其視為二進制文件并觸發下載行為。前端處理這類文件的核心步驟是:

  1. 通過請求獲取二進制數據
  2. 將數據轉換為 Blob 對象
  3. 創建臨時 URL 并觸發下載
  4. 釋放內存資源

方法一:使用 fetch API 和 Blob

這是目前最推薦的方式,適用于現代瀏覽器:

async function downloadFile(url, fileName) {try {const response = await fetch(url, {headers: {'Content-Type': 'application/octet-stream'},responseType: 'blob' // 重要:指定響應類型為blob});if (!response.ok) {throw new Error('下載失敗');}const blob = await response.blob();const downloadUrl = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = downloadUrl;a.download = fileName || 'download'; // 設置下載文件名document.body.appendChild(a);a.click();// 清理document.body.removeChild(a);window.URL.revokeObjectURL(downloadUrl);} catch (error) {console.error('下載出錯:', error);}
}

??優點??:

  • 代碼簡潔清晰
  • 支持設置請求頭,適合需要認證的場景
  • 可以處理大文件

方法二:使用 axios 處理二進制流

如果你的項目中使用 axios 作為 HTTP 客戶端,可以這樣實現:

axios.get('/api/download', {responseType: 'blob', // 必須設置headers: {'Content-Type': 'application/octet-stream'}
}).then(response => {// 從Content-Disposition獲取文件名const contentDisposition = response.headers['content-disposition'];let fileName = 'default.bin';if (contentDisposition) {const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/);if (fileNameMatch && fileNameMatch[1]) {fileName = decodeURIComponent(fileNameMatch[1].replace(/['"]/g, ''));}}const blob = new Blob([response.data], { type: 'application/octet-stream' });const url = window.URL.createObjectURL(blob);const link = document.createElement('a');link.href = url;link.download = fileName;document.body.appendChild(link);link.click();// 清理document.body.removeChild(link);window.URL.revokeObjectURL(url);
}).catch(error => {console.error('下載失敗:', error);
});

??注意事項??:

  1. 必須設置 responseType: 'blob',否則無法正確處理二進制數據
  2. 建議從 Content-Disposition 響應頭中獲取文件名,這樣更靈活
  3. 記得釋放創建的 ObjectURL,避免內存泄漏

方法三:處理混合響應(JSON和二進制流)

有時后端接口可能根據情況返回不同的內容類型 - 成功時返回二進制流,失敗時返回JSON錯誤信息。這時需要額外處理:

axios.get('/api/download', {responseType: 'blob'
}).then(response => {const contentType = response.headers['content-type'];// 判斷返回的是否是JSON錯誤if (contentType.includes('application/json')) {const reader = new FileReader();reader.onload = () => {const errorData = JSON.parse(reader.result);console.error('下載失敗:', errorData.message);// 顯示錯誤提示給用戶};reader.readAsText(response.data);} else {// 正常下載流程const blob = new Blob([response.data], { type: 'application/octet-stream' });// ...后續下載邏輯}
});

這種處理方式可以更好地處理錯誤情況,給用戶友好的提示。

進階技巧

1. 大文件下載與進度顯示

對于大文件下載,可以使用 ReadableStream 實現流式下載并顯示進度:

async function downloadLargeFile(url, fileName) {const response = await fetch(url);const reader = response.body.getReader();const contentLength = +response.headers.get('Content-Length');let receivedLength = 0;let chunks = [];while(true) {const {done, value} = await reader.read();if(done) break;chunks.push(value);receivedLength += value.length;console.log(`下載進度: ${(receivedLength/contentLength*100).toFixed(2)}%`);// 可以更新UI進度條updateProgress(receivedLength, contentLength);}// 合并所有chunksconst blob = new Blob(chunks);// ...后續下載邏輯
}

這種方式可以避免一次性加載大文件導致的內存問題。

2. IE瀏覽器兼容處理

對于需要支持IE10+的項目,可以使用 navigator.msSaveBlob

if (window.navigator && window.navigator.msSaveOrOpenBlob) {// IE專用方法navigator.msSaveOrOpenBlob(blob, fileName);
} else {// 標準方法const url = window.URL.createObjectURL(blob);// ...創建a標簽下載
}

這樣可以確保在IE瀏覽器中也能正常工作。

常見問題與解決方案

1. 文件名亂碼問題

當文件名包含中文或特殊字符時,可能會出現亂碼。解決方案是從 Content-Disposition 中正確解碼:

// 處理RFC5987編碼的文件名
const contentDisposition = response.headers['content-disposition'];
let fileName = 'download';if (contentDisposition) {const utf8FilenameRegex = /filename\*=UTF-8''([\w%\-\.]+)(?:; ?|$)/i;const match = utf8FilenameRegex.exec(contentDisposition);if (match) {fileName = decodeURIComponent(match[1]);} else {const filenameRegex = /filename="?([^"]+)"?/i;const match = filenameRegex.exec(contentDisposition);if (match) {fileName = match[1];}}
}

2. 跨域問題

如果下載接口跨域,需要確保:

  1. 服務器設置了正確的CORS頭
  2. 請求時帶上必要的憑據:
fetch(url, {credentials: 'include' // 攜帶cookie等憑據
});

3. 內存泄漏

每次調用 URL.createObjectURL() 都會創建一個新的URL對象,必須在使用后調用 URL.revokeObjectURL() 釋放內存。

總結

前端下載 application/octet-stream 類型的文件主要涉及以下關鍵點:

  1. ??設置正確響應類型??:請求時必須設置 responseType: 'blob'
  2. ??Blob轉換??:將響應數據轉換為Blob對象
  3. ??觸發下載??:通過創建a標簽和ObjectURL實現下載
  4. ??資源清理??:下載完成后釋放ObjectURL
  5. ??錯誤處理??:處理可能的JSON錯誤響應
  6. ??兼容性??:針對IE瀏覽器使用專用API

根據項目需求,可以選擇簡單的fetch方案或功能更全面的axios方案。對于大文件下載,建議使用流式處理并顯示進度,提升用戶體驗。

參考資源

  1. 前端接收 type: "application/octet-stream" 格式的數據并下載
  2. 前端axios調接口實現下載文件的解決方案
  3. 前端實現文件下載的4種常見方式與實戰示例

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

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

相關文章

咨詢顧問進階——顧問公司戰略咨詢分析模板【附全文閱讀】

該戰略咨詢分析模板圍繞企業戰略分析展開,先從總體思考戰略分析的目的與方法,接著探討企業及戰略定義、戰略地位等。外部環境分析通過 PEST、五種競爭力等模型,分析環境、行業、市場等情況以發現機會與威脅;內部環境分析從資源、核…

寶塔服務器調優工具 1.1(Opcache優化)

第一步:寶塔服務器調優工具 1.1(按照下面的參數填寫) 第二步:路徑/www/server/php/80/etc/php.ini 搜索jit jit1235 其中1235根據服務器情況修改 第三步:路徑/www/server/php/80/etc/php-cli.ini 搜索 jit1235 其中…

React Native【詳解】動畫

基礎動畫的實現流程 使用支持動畫的組件 <Animated.Viewstyle{[{opacity: fadeAnim, // 綁定透明度動畫值},]}><Text>動畫元素</Text></Animated.View>Animated.View&#xff1a;用于創建動畫容器&#xff0c;支持所有 View 的屬性。Animated.Te…

如何輕松地將照片從 iPhone 傳輸到計算機

如果您的照片占據了 iPhone 上最多的存儲空間&#xff0c;為什么不將照片從 iPhone 傳輸到電腦呢&#xff1f;您可能想要這樣做&#xff0c;但不知道如何開始&#xff1f;如果是這樣&#xff0c;那么本指南就是您所需要的。我們分享了 6 種方法以及步驟詳細信息。您可以按照一種…

操作系統之內存管理(王道)

本篇博客依據王道、與我的筆記而寫&#xff0c;講解了內存的基礎知識、內存管理的概念、進程的映像、連續分配管理方式、動態分區分配算法、基本分頁存儲管理、基本地址變換機構、TLB快表、兩級頁表、基本分段存儲管理方式、段頁式存儲管理方式、虛擬內存、請求分頁管理方式、頁…

C++11 std::thread 多線程編程詳解

C++11 標準首次將多線程支持引入語言標準庫,其中最核心的部分就是 <thread> 頭文件中的 std::thread 類。 ?? 一、基本概念 什么是線程? 線程是操作系統調度 CPU 時間的基本單位。一個進程中可以有多個線程,它們共享進程的資源(如內存、堆棧),但擁有各自獨立的…

設置vscode使用eslint

在 Visual Studio Code (VSCode) 中設置 ESLint 是一個很好的方式來確保代碼質量和一致性。以下是詳細的步驟&#xff1a; 1. 安裝 ESLint 擴展 打開 VSCode。點擊左側的擴展圖標&#xff08;四邊形圖標&#xff09;。在搜索框中輸入 ESLint。找到由 dbaeumer 提供的 ESLint …

.NET 生態中主流的前后端生產級框架

文章目錄 **1. 后端框架&#xff08;Backend Frameworks&#xff09;****(1) ASP.NET Core**&#xff08;微軟官方&#xff0c;主流選擇&#xff09;**(2) ABP Framework**&#xff08;企業級應用開發框架&#xff09; **2. 前端框架&#xff08;Frontend Frameworks&#xff0…

Spring Cloud Alibaba整合Sentinel指南

目錄 一、Sentinel核心功能概述 1. 控制臺安裝 2. 項目依賴配置 三、詳細整合步驟 1. 基礎配置 2. 資源定義與保護 3. 與OpenFeign整合 四、常見問題解決方案 五、最佳實踐案例 1. 流量控制場景 2. 熔斷降級場景 3. 熱點參數限流 六、高級功能 Spring Cloud Aliba…

Win10+PHPStudy 8.1完美運行CRMEB開源商城(附性能優化配置)

環境配置 下載phpstudy https://www.xp.cn/ 安裝完成之后打開&#xff0c;在軟件管理中安裝 nginx mysql 5.7 php 7.4 創建站點 填寫域名&#xff0c;根目錄選擇到public文件夾下 創建完成之后&#xff0c;點擊右側管理&#xff0c;選擇偽靜態 location / { if (!-e $request…

康謀方案 | ARXML 規則下 ECU 總線通訊與 ADTF 測試方案

目錄 一、引言 二、汽車電子控制系統 三、ECU開發流程中總線通訊&#xff1a;ARXML 規則下的標準化協作 四、ADTF&#xff1a;汽車數據與時間觸發框架&#xff08;Automotive Data and Time-Triggered Framework&#xff09; 五、應用案例 六、結語 一、引言 隨著汽車新…

常見JavaScript 代理模式應用場景解析

常見JavaScript 代理模式應用場景解析 在 JavaScript 開發中&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09; 是一種強大的設計模式&#xff0c;它允許我們通過創建一個“代理”來控制對目標對象的訪問。通過代理&#xff0c;我們可以攔截并增強對象的行為&#x…

暴雨信創電腦代理商成功中標長沙市中醫康復醫院

6月25日&#xff0c;國內科技產業領軍企業暴雨信息傳來喜訊&#xff0c;其信創電腦成功中標長沙市中醫康復醫院信息化設備采購項目。此次中標&#xff0c;不僅彰顯了暴雨信息在信創領域的技術實力和產品優勢&#xff0c;也為長沙市中醫康復醫院的信息化建設注入了新的活力。 長…

ZYNQ PL高速采集AD7606數據與QT動態顯示全解析

從硬件設計到軟件優化,打造工業級數據采集系統 在工業自動化、醫療儀器等領域,高速多通道數據采集系統至關重要。本文手把手教你基于Xilinx ZYNQ平臺,實現8通道200kSPS高速采集**,并通過QT實現60fps動態波形顯示。突破性采用五級流水采集架構和GPU加速渲染,解決傳統方案的…

還是工作日志

今天感覺效率有點低&#xff0c;可能是太熱了 【100】 開始不懂了 https://www.bilibili.com/video/BV1rL411E7uz?t1193.7&p100 什么新增&#xff0c;什么新增和變化 【101】退單 開頭就說不適合做事務型 https://www.bilibili.com/video/BV1rL411E7uz?t26.6&…

青少年編程與數學 01-012 通用應用軟件簡介 10 云存儲軟件

青少年編程與數學 01-012 通用應用軟件簡介 10 云存儲軟件 一、什么是云存儲軟件&#xff08;一&#xff09;云存儲軟件的基本定義&#xff08;二&#xff09;云存儲軟件的工作原理&#xff08;三&#xff09;云存儲軟件的類型 二、云存儲軟件的重要意義&#xff08;一&#xf…

華為云Flexus+DeepSeek征文 | 掌握高效開發:利用華為云ModelArts Studio在VS Code中配置Cline AI編程助手

華為云FlexusDeepSeek征文 | 掌握高效開發&#xff1a;利用華為云ModelArts Studio在VS Code中配置Cline AI編程助手 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Cline介紹Cline介紹Cline主要特點 三、開通DeepSeek-R1-0528商用…

Python核心可視化庫:Matplotlib與Seaborn深度解析

文章目錄 前言一、Matplotlib&#xff1a;科學可視化的基石1.1 核心架構層級后端層&#xff08;Backend Layer&#xff09;藝術家層&#xff08;Artist Layer&#xff09;腳本層&#xff08;Scripting Layer&#xff09; 1.2 核心模塊詳解matplotlib.figure 模塊matplotlib.axe…

EJB知識

EJB&#xff08;Enterprise JavaBeans&#xff09;是 Java EE&#xff08;現稱 Jakarta EE&#xff09;平臺的核心技術之一&#xff0c;用于開發分布式、可擴展、事務性的企業級應用。以下從基礎到高級全面解析 EJB&#xff1a; 一、EJB 基礎概念 1. 定義與角色 EJB 是服務器…

【項目管理】項目管理資料文檔模板(ZIP,PPT,WORD)

項目交付文檔 01項目詳細調研計劃編寫規范V1.0.doc 03項目詳細調研報告編寫規范V1.0.doc 07軟件需求規格說明書評審規范V1.0.doc 10.軟件需求規格說明.doc 產品檢查單,xls 工程評審.zip 軟件標準過程集.zip 系統測試管理規程.docx 四)項目管理計劃.doc 項目管理系統實施項目管理…