JavaScript下載文件導(dǎo)出到本地的兩種實現(xiàn)方式
前言
JavaScript 點擊跳轉(zhuǎn)文件地址時,有的文件會直接下載,而有的文件則在瀏覽器中直接打開,這主要取決于瀏覽器對文件類型的處理方式和服務(wù)器的響應(yīng)頭設(shè)置
瀏覽器對文件類型的處理
- 需要下載的文件:zip、docx 等文件,通常會觸發(fā)下載
- 可在瀏覽器中打開的文件:圖片(png、jpg)、視頻(mp4)、文本文件(txt)等,瀏覽器會嘗試打開這些文件
跨域和安全策略
- 如果文件來自不同域名,瀏覽器的安全策略(CORS)可能會影響文件的處理方式
- 某些文件可能因為安全原因被瀏覽器阻止直接打開,從而觸發(fā)下載
a 標(biāo)簽的 download 屬性
通過動態(tài)創(chuàng)建一個 a 標(biāo)簽,并設(shè)置 href 和 dowload 屬性來觸發(fā)下載
適用于同源或支持 cors 的跨域文件下載,也可以下載一個 base64 格式的文件
function download(url, fileName) {
const a = document.createElement("a")
a.href = url
a.download = fileName
a.click()
}
使用示例:后端接口返回一個 base64 格式的二維碼圖片,前端按鈕需要實現(xiàn)點擊按鈕將圖片下載到本地的功能
download('data:image/png;base64,iVBORwxxxxx', 'qrcode.png')
將網(wǎng)絡(luò)地址文件下載到本地
從指定 URL 下載文件并觸發(fā)并觸發(fā)瀏覽器的下載行為,這種實現(xiàn)方式可以繞過瀏覽器的同源策略限制
- 檢測 url 地址,然后獲取文件名稱
- 使用 XMLHttpRequest 發(fā)起文件下載請求
- onreadystatechange 下載狀態(tài)監(jiān)控,監(jiān)聽請求狀態(tài)變化
- onload 處理下載完成后的邏輯,請求成功時創(chuàng)建一個 a 標(biāo)簽觸發(fā)瀏覽器的下載行為
// 下載文件并導(dǎo)出本地
function downloadFile(url, name = '') {
// 檢測文件地址
if (url.substr(0, 4) !== 'http') {
throw new Error("請傳入一個網(wǎng)絡(luò)地址");
}
// 獲取文件名稱
let fileName;
if (name) {
const index = url.lastIndexOf('.')
fileName = name + (index === -1 ? url : url.substr(index))
} else {
const index = url.lastIndexOf('/')
fileName = index === -1 ? url : url.substr(index + 1)
}
// 執(zhí)行文件下載
const xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.responseType = 'blob';
xhr.onload = () => {
if (xhr.status === 200) {
const url = window.URL.createObjectURL(xhr.response)
const a = document.createElement('a');
a.href = url
a.download = fileName
a.click()
} else {
console.log('文件下載失敗');
}
}
xhr.onreadystatechange = () => {
if (xhr.readyState === 4) {
if (xhr.status == 200) {
console.log('文件下載成功');
}
} else if (xhr.readyState === 3) {
console.log('文件下載中');
}
}
xhr.send();
}
使用示例:
// 下載文件(導(dǎo)出時默認(rèn)使用原文件名)
downloadFile('https://img.xxx.com/thumb/xxxx.png')
// 下載文件,并且指定文件名稱(不需要寫文件后綴名,會自動拼接)
downloadFile('https://img.xxx.com/thumb/xxxx.png', 'qrcode')
到此這篇關(guān)于JavaScript下載文件導(dǎo)出到本地的兩種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)JavaScript下載文件導(dǎo)出到本地內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BootStrap table實現(xiàn)表格行拖拽效果
這篇文章主要為大家詳細(xì)介紹了BootStrap table實現(xiàn)表格行拖拽效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
JavaScript重定向URL參數(shù)的兩種方法小結(jié)
關(guān)于JavaScript重定向URL參數(shù)的實現(xiàn)方法網(wǎng)站有很多,這篇文章的主要內(nèi)容是從網(wǎng)上查找,并進(jìn)行了修改,簡單粗暴的實現(xiàn)使用JavaScript重置url參數(shù),文中給出了詳細(xì)的示例代碼和調(diào)用代碼,對大家的理解和學(xué)習(xí)很有幫助,感興趣的朋友們下面來一起看看吧。2016-10-10
IE8下關(guān)于querySelectorAll()的問題
在IE8的新特性里,提到了會支持querySelector()和querySelectorAll()方法,如何使用這里就不說了,只是記錄下我在使用時遇到一個問題。2010-05-05
TypeScript對于Duck類型和模塊命名空間應(yīng)用
這篇文章主要介紹了TypeScript對于Duck類型和模塊命名空間應(yīng)用,Duck類型是一種動態(tài)類型和多態(tài)形式,在duck類型中,重點是對象的行為可以做什么,而不是對象所屬的類型2022-08-08
微信小程序?qū)崿F(xiàn)pdf、word等格式文件上傳的方法
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)pdf,word等格式文件上傳的方法,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
JS利用原生canvas實現(xiàn)圖形標(biāo)注功能
這篇文章主要為大家詳細(xì)介紹了JS如何利用原生canvas實現(xiàn)圖形標(biāo)注功能,支持矩形、多邊形、線段、圓形等已繪制的圖形進(jìn)行縮放,移動,需要的可以參考下2024-03-03

