国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--盤點前端實現(xiàn)文件下載的幾種方式

這篇具有很好參考價值的文章主要介紹了記錄--盤點前端實現(xiàn)文件下載的幾種方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

記錄--盤點前端實現(xiàn)文件下載的幾種方式

前端涉及到的文件下載還是很多應用場景的,那么前端文件下載有多少種方式呢?每種方式有什么優(yōu)缺點呢?下面就來一一介紹。

1. 使用 a 標簽下載

通過a標簽的download屬性來實現(xiàn)文件下載,這種方式是最簡單的,也是我們比較常用的方式,先來看示例代碼:

<a?>下載</a>

就上面的這個示例,我們點擊下載,發(fā)現(xiàn)是跳轉到了百度的首頁,并沒有真的下載文件。

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

上面的代碼是直接通過書寫a標簽來實現(xiàn)文件下載;我們也可以通過js來實現(xiàn),代碼如下:

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

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

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

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

2. 使用 window.open 下載

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

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 實現(xiàn)下載原理決定的。

3. 使用 location.? 下載

以下可以實現(xiàn)頁面跳轉的屬性,都可以實現(xiàn)文件下載

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是有點特殊的,它的作用是重新加載當前頁面,但是它也可以接受一個參數(shù),這個參數(shù)就是要跳轉的頁面,所以也可以實現(xiàn)文件下載。

當然同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來創(chuàng)建一個URL,最后使用a標簽的download屬性來實現(xiàn)文件下載。

5.1 Blob 對象

下面是MDNBlob對象的定義:

Blob對象表示一個不可變、原始數(shù)據(jù)的類文件對象。

Blob的數(shù)據(jù)可以按文本或二進制的格式進行讀取,也可以轉換成ReadableStream來用于數(shù)據(jù)操作。

Blob表示的不一定是JavaScript原生格式的數(shù)據(jù)。

File接口基于Blob,繼承了Blob的功能并將其擴展以支持用戶系統(tǒng)上的文件。

Blob對象是html5新增的對象,它的作用是用來存儲二進制數(shù)據(jù)的,比如圖片、視頻、音頻等,它的使用方法如下:

/**
?*?@param?{Array}?array?二進制數(shù)據(jù)
?*?@param?{Object}?options?配置項
?*?@param?{String}?options.type 文件類型,它代表了將會被放入到 blob 中的數(shù)組內容的 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()靜態(tài)方法會創(chuàng)建一個DOMString,其中包含一個表示參數(shù)中給出的對象的URL。

這個URL的生命周期和創(chuàng)建它的窗口中的document綁定。

這個新的URL對象表示指定的File對象或Blob對象。

這個方法是用來創(chuàng)建一個URL的,它的作用是把一個Blob對象轉換成一個URL,這個URL可以用來下載文件,也可以用來預覽文件,代碼如下:

const?url?=?URL.createObjectURL(blob)

這里需要注意的是,這個URL的生命周期和創(chuàng)建它的窗口中的document綁定。

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

代碼如下:

URL.revokeObjectURL(url)

回到我們剛才下載的問題,我們是通過Blob對象來解決,但是我們的type屬性是寫死的,如果在文件類型是確定的情況下是沒問題的。

但是如果這個接口就是下載文件的接口,文件可能是各種類型的,我們應該怎么處理?

這里的沒有正確答案,第一個可以和接口提供者進行協(xié)商,協(xié)商方案是不確定的;第二就是通過Responseheader來獲取文件的type,也是我們要講的:

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

這里我們通過Responseheader來獲取type,然后再創(chuàng)建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

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

?記錄--盤點前端實現(xiàn)文件下載的幾種方式文章來源地址http://www.zghlxwxcb.cn/news/detail-546116.html

到了這里,關于記錄--盤點前端實現(xiàn)文件下載的幾種方式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 前端實現(xiàn)文件下載功能——文件流

    前端下載文件一般使用的是blob 核心的步驟是獲取后端響應的文件流,用blob創(chuàng)建一個臨時的URL,然后創(chuàng)建一個隱藏的a標簽,實現(xiàn)下載需求。 那就先上代碼 如果后端響應的數(shù)據(jù)是一個二進制數(shù)據(jù),那我們就得這是響應類型是blob,否則瀏覽器會默認按照json解析 至于后端如何向

    2024年02月11日
    瀏覽(22)
  • 前端實現(xiàn)下載文件(包含壓縮包下載)方式匯總

    默認最簡單的下載方式是: window.open(后臺接口API路徑) ,但該方法弊端:因是新開窗口方式,前端展示上,每次會閃下。 此外,如果使用window.open(文件URL)方式: pdf、office文檔、psd:直接下載。 圖片、txt:新開窗口預覽,不會下載;且txt預覽,有時出現(xiàn)中文亂碼問題。 一、

    2024年02月10日
    瀏覽(19)
  • 【Java 實現(xiàn)文件下載】vue前端+java后端實現(xiàn)文件下載詳解(附源碼)

    【Java 實現(xiàn)文件下載】vue前端+java后端實現(xiàn)文件下載詳解(附源碼)

    【 寫在前面 】前端時間總結了一下有關java文件上傳的功能,也給不少讀者帶來一些幫助,因此今天繼續(xù)完善文件下載這套體系,希望能給屏幕前的您帶來實質性的幫助,其實文件下載最怕的就是中文亂碼的現(xiàn)象,當然這個我單獨寫了一篇文章解釋,這里不做詳談。 涉及知識

    2024年02月09日
    瀏覽(105)
  • 前端發(fā)送請求獲取后端文件,并且前端實現(xiàn)下載文件功能

    前端發(fā)送請求獲取后端文件,并且前端實現(xiàn)下載文件功能

    最近遇到一個需求,就是前端發(fā)送post請求獲取后端的excel文件,并且前端實現(xiàn)下載導出到本地的功能。 前端頁面就長上面那樣,一個批量導出功能,用戶勾選之后,前端通過接口把id和其他的參數(shù)傳給后端,接口調用方法這里需要注意的是,這里必須設置responseType: ‘blob’

    2024年02月09日
    瀏覽(31)
  • 前端實現(xiàn)下載文件的方法匯總

    對于前端來說,下載文件是一個特別常見的需求。但是前端要根據(jù)后端返回的內容,來選擇下載文件的具體方法。通常情況下,后端要么給你 返回文件的網(wǎng)絡地址 ,要么 返回文件流 。返回地址一般用在靜態(tài)文件上,比如圖片和音視頻資源等;返回文件流一般用在動態(tài)文件上

    2024年02月09日
    瀏覽(25)
  • 前端實現(xiàn)下載文件的各種方式

    前端實現(xiàn)下載文件的各種方式

    前端涉及到的文件下載還是很多應用場景的,那么前端文件下載有多少種方式呢?每種方式有什么優(yōu)缺點呢?下面就來一一介紹。 通過 a 標簽的 download 屬性來實現(xiàn)文件下載,這種方式是最簡單的,也是我們比較常用的方式,先來看示例代碼: 就上面的這個示例,我們點擊下

    2024年02月16日
    瀏覽(21)
  • windows.open 在vue前端實現(xiàn)文件下載(自定義下載文件名)

    windows.open 在vue前端實現(xiàn)文件下載(自定義下載文件名)

    1. 將要下載的文件放在前端項目的 assets 文件夾內 ?我要下載的文件為? src/assrts/xxx/xxx模板.csv ?2. 在頁面創(chuàng)建下載按鈕? ? 3. 導入該文件 4.?在build文件夾下的webpack.base.conf.js?文件中,添加csv(或者其他)解析類型 5. 編寫下載方法 參考自:vue 實現(xiàn)本地excel文件下載功能_璐哈

    2024年02月05日
    瀏覽(371)
  • 【前端下載文件流詳解】前端實現(xiàn)多種類型文件(word,excel,pdf,rar,zip等)的下載,接口返回文件流形式(附源碼)

    【前端下載文件流詳解】前端實現(xiàn)多種類型文件(word,excel,pdf,rar,zip等)的下載,接口返回文件流形式(附源碼)

    【 寫在前面 】其實之前我也寫了有關java實現(xiàn)文件的下載,但是當時是局限于excel文檔,針對其他類型的并沒有介紹,這次剛好有個客戶現(xiàn)場反饋回來的,說我們系統(tǒng)確實能下載報告,但是甲方領導要看所有的報告,這不我每天得一個一個的點擊下載,然后再打包給他們領導

    2023年04月24日
    瀏覽(35)
  • 后端接口返回文件流格式、前端如何實現(xiàn)文件下載導出呢?

    后端接口返回文件流格式、前端如何實現(xiàn)文件下載導出呢?

    在項目開發(fā)過程中,難免會需要實現(xiàn)文件下載功能,記錄下自己實際開發(fā)過程過程中遇到兩種實現(xiàn)的方式。一種:后端直接返回加密url ,前端解密后直接使用 a標簽下載就可以,這種方法相等比較簡單,另一種:后端接口直接返回文件流,這種方式前端就需要單獨封裝對應的

    2024年02月16日
    瀏覽(30)
  • 前端實現(xiàn)流文件下載、導出功能解決方案

    前端實現(xiàn)流文件下載、導出功能解決方案

    1、封裝下載方法(可以通過掛載在vue實例上成為全局函數(shù)) 2、調用下載方法 ·1、處理響應攔截器返回的數(shù)據(jù),將文件名暴露暴露出去 2、封裝下載方法 3、調用下載方法 問題一:后端返回的數(shù)據(jù)無法解析 在請求函數(shù)中添加響應類型以及響應頭 問題二、后端返回的文件名經

    2024年04月23日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包