主頁 > 企業開發 > 記錄--盤點前端實作檔案下載的幾種方式

記錄--盤點前端實作檔案下載的幾種方式

2023-07-12 08:46:10 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

前端涉及到的檔案下載還是很多應用場景的,那么前端檔案下載有多少種方式呢?每種方式有什么優缺點呢?下面就來一一介紹,

1. 使用 a 標簽下載

通過a標簽的download屬性來實作檔案下載,這種方式是最簡單的,也是我們比較常用的方式,先來看示例代碼:

<a href="http://www.baidu.com" download="baidu.html">下載</a>

就上面的這個示例,我們點擊下載,發現是跳轉到了百度的首頁,并沒有真的下載檔案,

因為a標簽下載只能下載同源的檔案;如果是跨域的檔案,比如圖片、音視頻等媒體檔案等都無法使用上面的a標簽方式下載,

上面的代碼是直接通過書寫a標簽來實作檔案下載;我們也可以通過js來實作,代碼如下:

const a = document.createElement('a')
a.href = 'http://www.baidu.com'
a.download = 'baidu.html'
a.click()

效果和上面的一樣,都是跳轉到百度的首頁,沒有下載檔案,

這里的重點是a標簽的download屬性,這個屬性是HTML5新增的,

它的作用是指定下載的檔案名,如果不指定,那么下載的檔案名就會根據請求內容的Content-Disposition來確定,如果沒有Content-Disposition,那么就會使用請求的URL的最后一部分作為檔案名,

2. 使用 window.open 下載

上面使用a標簽的案例也可以通過window.open來實作,效果是一樣的,代碼如下:

window.open('http://www.baidu.com', '_blank')

這里的_blank是指定用瀏覽器新視窗打開鏈接;如果不指定,那么就會在當前頁面打開,

同樣a標簽的download屬性也是可以使用的,代碼如下:

window.open('http://www.baidu.com', '_blank', 'download=baidu.html')

當然這種方式也是有缺陷的,對比于a標簽,window.open方式不能下載.html.htm.xml.xhtml等檔案;因為這些檔案會被當成html檔案來處理,所以會直接在當前頁面打開,

同樣也不能下載跨域的檔案,這個是window.open 實作下載原理決定的,

3. 使用 location.? 下載

以下可以實作頁面跳轉的屬性,都可以實作檔案下載

3.1 location.href

// 這個方式和window.open是一樣的
location.href = 'http://www.baidu.com'

這種方式擁有window.open的所有缺陷,所以不推薦使用,這里只當作了解,所以不做過多的講解,

3.2 location.assign

location.assign('http://www.baidu.com')

3.3 location.replace

location.replace('http://www.baidu.com')

3.4 location.reload

location.reload('http://www.baidu.com')

location.reload是有點特殊的,它的作用是重新加載當前頁面,但是它也可以接受一個引數,這個引數就是要跳轉的頁面,所以也可以實作檔案下載,

當然同location.href一樣,這些方式的缺點都一樣,同時還有屬于每個屬性自身的特性,這里只當拓展知識,不做過多的講解,

4. XMLHttpRequest

這種方式就是我們常說的ajax下載,包括AxiosFetch等,代碼如下:

const xhr = new XMLHttpRequest()
xhr.open('GET', 'http://www.baidu.com')
xhr.send()

xhr.onload = function () {
  const blob = new Blob([xhr.response], { type: 'text/html' })
  const a = document.createElement('a')
  a.href = URL.createObjectURL(blob)
  a.download = 'baidu.html'
  a.click()
}

這里關于XMLHttpRequest相關的知識就不做展開了,只講和檔案下載相關的部分,

上面代碼主要的邏輯是當我們的請求成功后,我們會拿到回應體Response,這個Response就是我們要下載的內容,

然后我們把它轉換成Blob物件,通過URL.createObjectURL來創建一個URL,最后使用a標簽的download屬性來實作檔案下載,

5.1 Blob 物件

下面是MDNBlob物件的定義:

Blob物件表示一個不可變、原始資料的類檔案物件,

Blob的資料可以按文本或二進制的格式進行讀取,也可以轉換成ReadableStream來用于資料操作,

Blob表示的不一定是JavaScript原生格式的資料,

File介面基于Blob,繼承了Blob的功能并將其擴展以支持用戶系統上的檔案,

Blob物件是html5新增的物件,它的作用是用來存盤二進制資料的,比如圖片、視頻、音頻等,它的使用方法如下:

/**
 * @param {Array} array 二進制資料
 * @param {Object} options 配置項
 * @param {String} options.type 檔案型別,它代表了將會被放入到 blob 中的陣列內容的 MIME 型別,
 * @param {String} options.endings 用于指定包含行結束符\n的字串如何被寫入,默認為transparent,表示不會修改行結束符,還可以指定為native,表示會將\n轉換為\r\n,
 */
const blob = new Blob([], { type: '' })

Tips:需要關注的是type屬性,默認情況下, Blob物件是沒有type屬性的,那么這個Blob就是一個無型別的Blob ,檔案不會損毀,但是無法被正常識別,

5.2 URL.createObjectURL

下面是MDNURL.createObjectURL方法的定義:

URL.createObjectURL()靜態方法會創建一個DOMString,其中包含一個表示引數中給出的物件的URL

這個URL的生命周期和創建它的視窗中的document系結,

這個新的URL物件表示指定的File物件或Blob物件,

這個方法是用來創建一個URL的,它的作用是把一個Blob物件轉換成一個URL,這個URL可以用來下載檔案,也可以用來預覽檔案,代碼如下:

const url = URL.createObjectURL(blob)

這里需要注意的是,這個URL的生命周期和創建它的視窗中的document系結,

也就是說,當我們的document被銷毀后,這個URL就會失效,所以我們需要在合適的時機銷毀它,

代碼如下:

URL.revokeObjectURL(url)

回到我們剛才下載的問題,我們是通過Blob物件來解決,但是我們的type屬性是寫死的,如果在檔案型別是確定的情況下是沒問題的,

但是如果這個介面就是下載檔案的介面,檔案可能是各種型別的,我們應該怎么處理?

這里的沒有正確答案,第一個可以和介面提供者進行協商,協商方案是不確定的;第二就是通過Responseheader來獲取檔案的type,也是我們要講的:

const type = response.headers['content-type']
const blob = new Blob([response.data], { type })

這里我們通過Responseheader來獲取type,然后再創建Blob物件,這樣就可以正確的下載檔案了,

其實content-type也可能是application/octet-stream,這個時候我們就需要通過file-type來獲取檔案的type了,

下面的代碼是通過file-type來獲取檔案的type

import {fileTypeFromStream} from 'file-type';

const type = await fileTypeFromStream(response.body);
const blob = new Blob([response.data], { type })

5. 總結

上面的方案這么多,其實最侄訓是落到a標簽上,所以不管是通過瀏覽器的內置行為進行下載,還是通過ajax進行下載,檔案下載的最侄訓是瀏覽器的行為,

本文轉載于:

https://juejin.cn/post/7254143696483991611

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/557052.html

標籤:Html/Css

上一篇:基于分步表單的實踐探索

下一篇:返回列表

標籤雲
其他(162414) Python(38274) JavaScript(25530) Java(18294) C(15239) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7294) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4615) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1997) .NET技术(1986) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--盤點前端實作檔案下載的幾種方式

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前端涉及到的檔案下載還是很多應用場景的,那么前端檔案下載有多少種方式呢?每種方式有什么優缺點呢?下面就來一一介紹。 1. 使用 a 標簽下載 通過a標簽的download屬性來實作檔案下載,這種方式是最簡單的,也是我們比較常用的方式,先來 ......

    uj5u.com 2023-07-12 08:46:10 more
  • 基于分步表單的實踐探索

    >我們是[袋鼠云數堆疊 UED 團隊](http://ued.dtstack.cn/),致力于打造優秀的一站式資料中臺產品。我們始終保持工匠精神,探索前端道路,為社區積累并傳播經驗價值。。 >本文作者:修能 ***以下內容充滿個人觀點。? ヽ(`Д´)? ┻━┻*** # 前言 基于分布表單的需求,在 ......

    uj5u.com 2023-07-12 08:40:55 more
  • SQ工具|10|ArcMap資料庫合并工具

    可對相同結構的資料庫進行批量合并,包括shp檔案 點擊目標資料庫選擇要'合并至'的資料庫,點擊+按鈕添加要參與合并的資料庫,選擇完所有需要合并的資料庫后,點擊確認即可完成合并。 備注: ①參與合并的資料庫結構必須相等。 ②目標資料庫建議選擇相同結構的空資料庫。 ③資料庫較多時,最好分批合并。字太少了 ......

    uj5u.com 2023-07-12 08:34:28 more
  • SQ工具|9|資料安全|ArcMap自動保存|ArcMap自動備份插件

    可解決在作業程序中停電、軟體閃退等一系列問題導致的ArcMap自動退出而未來得及保存資料造成的資料丟失的問題 一、自動保存 在開啟編輯的狀態下,設定保存周期,狀態選擇開啟點擊確認即可開啟自動保存任務(提示框位于右下角) 當一個保存周期內資料未變化時,將不會觸發自動保存。 狀態選擇關閉時點擊確認,即可 ......

    uj5u.com 2023-07-12 08:34:19 more
  • SQ工具|8|欄位順序編碼|同項順序編碼|自西向東,自北向南編碼

    順序編碼主要解決類似BSM等類欄位按照12345順序編碼以及同專案順序編碼。 一:順序編碼的實作 ①使用欄位計算器及OID欄位進行更新 例:如果想在index中填充從1開始依次加1的值,那么在欄位計算器中將index計算為FID+1即可,在源檔案為shp檔案時,OID一直保持從0開始遞增的值。但是在 ......

    uj5u.com 2023-07-12 08:34:04 more
  • SQ工具|7|域值型欄位的更新

    應用場景:如不動產登記系統中的ZDJBXX表,存在欄位YT和GHYTMC,兩欄位按照土地用途型別字典表一一對應,比如0702對應農村宅基地。根據YT更新GHYTMC。 已內置了四組字典,分別是土地用途,房屋用途,房屋性質,房屋型別 分別選擇對應的鍵欄位,值欄位;值欄位為要更新的欄位,若勾選下方選擇框 ......

    uj5u.com 2023-07-12 08:33:50 more
  • 4.10 x64dbg 反匯編功能的封裝

    LyScript 插件提供的反匯編系列函式雖然能夠實作基本的反匯編功能,但在實際使用中,可能會遇到一些更為復雜的需求,此時就需要根據自身需要進行二次開發,以實作更加高級的功能。本章將繼續深入探索反匯編功能,并將介紹如何實作反匯編代碼的檢索、獲取上下一條代碼等功能。這些功能對于分析和除錯代碼都非常有用... ......

    uj5u.com 2023-07-12 08:33:39 more
  • SQ工具|10|ArcMap資料庫合并工具

    可對相同結構的資料庫進行批量合并,包括shp檔案 點擊目標資料庫選擇要'合并至'的資料庫,點擊+按鈕添加要參與合并的資料庫,選擇完所有需要合并的資料庫后,點擊確認即可完成合并。 備注: ①參與合并的資料庫結構必須相等。 ②目標資料庫建議選擇相同結構的空資料庫。 ③資料庫較多時,最好分批合并。字太少了 ......

    uj5u.com 2023-07-12 08:32:58 more
  • SQ工具|9|資料安全|ArcMap自動保存|ArcMap自動備份插件

    可解決在作業程序中停電、軟體閃退等一系列問題導致的ArcMap自動退出而未來得及保存資料造成的資料丟失的問題 一、自動保存 在開啟編輯的狀態下,設定保存周期,狀態選擇開啟點擊確認即可開啟自動保存任務(提示框位于右下角) 當一個保存周期內資料未變化時,將不會觸發自動保存。 狀態選擇關閉時點擊確認,即可 ......

    uj5u.com 2023-07-12 08:32:48 more
  • SQ工具|8|欄位順序編碼|同項順序編碼|自西向東,自北向南編碼

    順序編碼主要解決類似BSM等類欄位按照12345順序編碼以及同專案順序編碼。 一:順序編碼的實作 ①使用欄位計算器及OID欄位進行更新 例:如果想在index中填充從1開始依次加1的值,那么在欄位計算器中將index計算為FID+1即可,在源檔案為shp檔案時,OID一直保持從0開始遞增的值。但是在 ......

    uj5u.com 2023-07-12 08:27:25 more