JavaScript下載blob二進(jìn)制文件流的詳細(xì)步驟
項(xiàng)目需求
- 在項(xiàng)目開發(fā)中,經(jīng)常會(huì)遇到需要調(diào)用接口從后端獲取Blob二進(jìn)制文件流,在前端通過Blob二進(jìn)制文件流下載文件的需求。
Blob
Blob(Binary Large Object):表示二進(jìn)制類型的大對(duì)象。在數(shù)據(jù)庫管理系統(tǒng)中,將二進(jìn)制數(shù)據(jù)存儲(chǔ)為一個(gè)單一個(gè)體的集合。Blob 通常是影像、聲音或多媒體文件。在 JavaScript 中 Blob 類型的對(duì)象表示不可變的類似文件對(duì)象的原始數(shù)據(jù)。
Blob構(gòu)造函數(shù)語法:
new Blob(blobParts, options);
- blobParts:Blob / BufferSource / String值的數(shù)組
- options:可選對(duì)象
- type:Blob 類型,通常是 MIME 類型,例如
text/plain
- endings:默認(rèn)值為
transparent
,用于指定包含行結(jié)束符\n
的字符串如何被寫入;第二個(gè)值為native
,代表行結(jié)束符會(huì)被更改為適合宿主操作系統(tǒng)文件系統(tǒng)的換行符。
- endings:默認(rèn)值為
- type:Blob 類型,通常是 MIME 類型,例如
文件下載
首先創(chuàng)建一個(gè)axios實(shí)例用于請(qǐng)求接口,從后端獲取blob二進(jìn)制流文件
import axios from "axios"; const service = axios.create({ // axios中請(qǐng)求配置有baseURL選項(xiàng),表示請(qǐng)求根路徑 baseUrl: 'http:xx.xxx.xx.xx', // 超時(shí) timeout: 60000 })
封裝下載blob二進(jìn)制流文件的方法
import { Message } from "element-ui"; /** * * @param {*} url 接口url * @param {*} data 接口傳參 * @param {*} filename 文件名 */ export function downloadFile (url, data, filename) { return service.post(url, data, { // axios將響應(yīng)的數(shù)據(jù)強(qiáng)制轉(zhuǎn)為blob responseType: 'blob', headers: { "Content-Type": "application/json;charset=UTF-8", }, }).then((res) => { // 判斷接口返回的數(shù)據(jù)類型,若返回類型為application/json,則證明獲取二進(jìn)制文件流失敗 if (res.type === 'application/json') { //創(chuàng)建一個(gè)FileReader實(shí)例 const reader = new FileReader(); //讀取文件 reader.readAsText(response.data, 'utf-8'); reader.onload = function() { //讀取完成后,獲取msg接口返回信息, const {msg} = JSON.parse(reader.result); // 使用Message組件彈出錯(cuò)誤提示,如 Message({ message: msg, type: "error" }); } return; } // 接口返回?cái)?shù)據(jù)為二進(jìn)制流文件 const content = res; // 根據(jù)接口返回的二進(jìn)制流創(chuàng)建Blob類文件對(duì)象 const blob = new Blob([content]); // 使用原生js創(chuàng)建一個(gè)a元素標(biāo)簽 const elink = document.createElement("a"); // 獲取方法形參中的filename文件名 elink.download = filename; // 通過原生js讓a標(biāo)簽的display屬性值為none,從而隱藏a標(biāo)簽 elink.style.display = "none"; // 通過blob創(chuàng)建下載的鏈接 const href = URL.createObjectURL(blob); // 通過原生js讓a標(biāo)簽的href屬性為創(chuàng)建好的下載鏈接 elink.href = URL.createObjectURL(blob); // 在html中添加a標(biāo)簽 document.body.appendChild(elink); // 給a標(biāo)簽調(diào)用點(diǎn)擊事件,開始下載 elink.click(); // 釋放掉blob對(duì)象 URL.revokeObjectURL(elink.href); // 在html中移除此a標(biāo)簽 document.body.removeChild(elink); }).catch((err) => { console.error(err); }); }
在vue項(xiàng)目utils文件夾下創(chuàng)建名為downloadFile.js的文件(文件名隨意),將上述兩段代碼復(fù)制粘貼其中。
使用封裝好的下載文件方法
// 引入封裝好的下載方法,引入路徑為相對(duì)路徑 import { downloadFile } from '../downloadFile.js' const batchCode = '28256' downloadFile('/photoreview/photoDeal/downLoadPhotoZip', { batchCode: batchCode }, batchCode + `批次相片.zip`).then(() => { // 文件下載成功后的操作 ... })
總結(jié)
- 文件下載主要分為以下幾步:
獲取二進(jìn)制文件流
根據(jù)二進(jìn)制流創(chuàng)建Blob類文件對(duì)象
創(chuàng)建一個(gè)a元素標(biāo)簽,并隱藏起來
通過創(chuàng)建的Blob類文件對(duì)象創(chuàng)建下載鏈接
給a標(biāo)簽指定文件名和下載鏈接
將a標(biāo)簽添加進(jìn)html中,并調(diào)用點(diǎn)擊事件,下載文件
下載后釋放掉Blob類文件對(duì)象,并在html中移除此a標(biāo)簽
到此這篇關(guān)于JavaScript下載blob二進(jìn)制文件流的文章就介紹到這了,更多相關(guān)js下載blob二進(jìn)制文件流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript的concat方法實(shí)例代碼(數(shù)組連接)
這篇文章主要介紹了JavaScript的concat方法實(shí)例代碼,包括數(shù)組連與字符連接,需要的朋友可以參考下2023-03-03深度剖析JavaScript作用域從局部到全局一網(wǎng)打盡
這篇文章主要為大家介紹了JavaScript作用域的深度剖析,從局部到全局一網(wǎng)打盡,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05networkInformation.downlink測(cè)用戶網(wǎng)速方法詳解
這篇文章主要為大家介紹了networkInformation.downlink測(cè)用戶網(wǎng)速方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05javascript中定義私有方法說明(private method)
本篇文章主要是對(duì)javascript中定義私有方法(private method)進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01javascript實(shí)現(xiàn)簡單小鋼琴有聲彈奏效果
用HTML5+javascript實(shí)現(xiàn)的小鋼琴,按下鋼琴鍵上的相應(yīng)字母用或用鼠標(biāo)點(diǎn)擊鋼琴鍵發(fā)聲,javascript代碼包含了對(duì)鼠標(biāo)按下、移動(dòng)和松開,以及鍵盤按下的事件監(jiān)聽2024-02-02JavaScript如何獲取到導(dǎo)航條中HTTP信息
這篇文章主要為大家詳細(xì)介紹了JavaScript如何獲取到導(dǎo)航條中HTTP信息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10js中innerText/textContent和innerHTML與target和currentTarget的區(qū)別
今天小編就為大家分享一篇關(guān)于js中innerText/textContent和innerHTML與target和currentTarget的區(qū)別,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01JS中利用localStorage防止頁面動(dòng)態(tài)添加數(shù)據(jù)刷新后數(shù)據(jù)丟失
本文給大家分享一段js代碼利用利用localStorage防止頁面動(dòng)態(tài)添加數(shù)據(jù)刷新后數(shù)據(jù)丟失問題,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-03-03