中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

房地產(chǎn)開(kāi)發(fā)公司取名網(wǎng)站關(guān)鍵詞優(yōu)化排名軟件

房地產(chǎn)開(kāi)發(fā)公司取名,網(wǎng)站關(guān)鍵詞優(yōu)化排名軟件,寧波網(wǎng)站推廣制作公司,網(wǎng)站正在建設(shè)中 html源碼用 JavaScript 的 axios 實(shí)現(xiàn)文件下載功能,咱們要分幾個(gè)步驟來(lái)搞定它!最主要的部分是處理 二進(jìn)制數(shù)據(jù),可以生成一個(gè)進(jìn)度檢測(cè),然后把它保存為文件。 文件名的獲取二進(jìn)制數(shù)據(jù)獲取創(chuàng)建下載鏈接 const axios require(axios);const g…

用 JavaScript 的 axios 實(shí)現(xiàn)文件下載功能,咱們要分幾個(gè)步驟來(lái)搞定它!最主要的部分是處理 二進(jìn)制數(shù)據(jù),可以生成一個(gè)進(jìn)度檢測(cè),然后把它保存為文件。

  • 文件名的獲取
  • 二進(jìn)制數(shù)據(jù)獲取
  • 創(chuàng)建下載鏈接

const axios = require('axios');const getFileNameFromContentDisposition = (contentDisposition) => {const fileNameMatch = contentDisposition && contentDisposition.match(/filename="?([^"]+)"?/);return fileNameMatch ? fileNameMatch[1] : null;
};const getFileNameFromUrl = (fileUrl) => {return fileUrl.split('/').pop();
};const downloadFile = async (fileUrl, defaultFileName = 'downloaded-file') => {try {const response = await axios({url: fileUrl,method: 'GET',responseType: 'blob', // 以二進(jìn)制方式接收數(shù)據(jù)onDownloadProgress: (progressEvent) => {// progressEvent 包含了下載進(jìn)度信息const total = progressEvent.total; // 文件總大小const loaded = progressEvent.loaded; // 已經(jīng)下載的部分// 計(jì)算進(jìn)度百分比const percentage = Math.floor((loaded / total) * 100);// 顯示進(jìn)度(可替換為實(shí)際的進(jìn)度條)console.log(`下載進(jìn)度:${percentage}%`);}});// 獲取文件名let fileName = getFileNameFromContentDisposition(response.headers['content-disposition']) || getFileNameFromUrl(fileUrl) || defaultFileName;// 創(chuàng)建 Blob 對(duì)象const blob = new Blob([response.data], { type: response.headers['content-type'] });// 創(chuàng)建 Blob URLconst blobUrl = window.URL.createObjectURL(blob);// 創(chuàng)建 <a> 元素并觸發(fā)下載const link = document.createElement('a');link.href = blobUrl;link.download = fileName;// 將 <a> 元素添加到 DOM 并觸發(fā)點(diǎn)擊document.body.appendChild(link);link.click();// 移除 <a> 元素document.body.removeChild(link);// 釋放 Blob URLwindow.URL.revokeObjectURL(blobUrl);} catch (error) {console.error('文件下載失敗: ', error);}
};// 調(diào)用下載函數(shù),傳入文件URL
downloadFile('https://example.com/path/to/your/file.pdf');

從代碼優(yōu)化和健壯性角度出發(fā),我們可以把這三種文件名獲取方式結(jié)合起來(lái),優(yōu)先從響應(yīng)頭中提取文件名,然后如果沒(méi)有Content-Disposition,再?gòu)?URL 提取文件名,最后可以提供一個(gè)默認(rèn)文件名作為兜底方案。此外,考慮到代碼可讀性和可維護(hù)性,上面代碼做一些清晰的封裝與優(yōu)化處理。

  1. 文件名獲取邏輯封裝

    • getFileNameFromContentDisposition:專門用于從 Content-Disposition 頭部提取文件名,使用正則匹配,考慮了有引號(hào)和沒(méi)有引號(hào)的情況。
    • getFileNameFromUrl:用于從 URL 提取文件名,確保從路徑最后一部分獲取到文件名。
    • 優(yōu)先級(jí):先從 Content-Disposition 獲取文件名,如果沒(méi)有,再?gòu)?URL 提取,最后使用默認(rèn)文件名。
  2. 默認(rèn)文件名

    • 提供了 defaultFileName 參數(shù),確保當(dāng)無(wú)法從響應(yīng)頭和 URL 獲取文件名時(shí),仍然有一個(gè)合理的文件名用于下載。
  3. 異常處理

    • 使用 try-catch 包圍整個(gè)下載過(guò)程,確保即使出現(xiàn)網(wǎng)絡(luò)或其他問(wèn)題,錯(cuò)誤也能被捕獲并輸出到控制臺(tái),而不會(huì)影響頁(yè)面的其他功能。
  4. 內(nèi)存管理

    • 確保 window.URL.revokeObjectURL(blobUrl) 在文件下載后被調(diào)用,釋放 Blob URL,防止內(nèi)存泄漏。

健壯性和可擴(kuò)展性:

  • 健壯性:我們確保了即使某個(gè)步驟失敗,代碼也能繼續(xù)運(yùn)行。文件名無(wú)法從響應(yīng)頭或 URL 獲取時(shí),始終有一個(gè)默認(rèn)文件名兜底。
  • 可擴(kuò)展性:如果未來(lái)需要支持更多的文件名獲取邏輯或更復(fù)雜的響應(yīng)頭處理,只需修改或添加新的獲取方式即可,而不會(huì)影響整體代碼結(jié)構(gòu)。

為什么可以立即移除 <a> 元素?

點(diǎn)擊事件:link.click() 觸發(fā)后,瀏覽器會(huì)處理下載請(qǐng)求,下載任務(wù)已經(jīng)在后臺(tái)進(jìn)行。<a> 元素的點(diǎn)擊只是用來(lái)啟動(dòng)這個(gè)過(guò)程。

DOM 操作與事件的異步性:瀏覽器在處理用戶點(diǎn)擊和下載之間有一定的時(shí)間差,移除 <a>元素是在 click 事件完成后進(jìn)行,不會(huì)影響已經(jīng)發(fā)出的下載請(qǐng)求。


為什么不用關(guān)注文件類型

下載文件的前置條件中不依賴于文件的具體類型,實(shí)際上,代碼對(duì)文件類型的處理是比較通用的。這是通過(guò)以下幾個(gè)方面實(shí)現(xiàn)的:

1. 響應(yīng)類型的設(shè)置

  • 在 Axios 請(qǐng)求中,我們將 responseType 設(shè)置為 'blob',這意味著無(wú)論文件類型是什么,瀏覽器都將其作為 Blob 對(duì)象處理。Blob 可以表示二進(jìn)制數(shù)據(jù),而不關(guān)心其具體的內(nèi)容類型。

2. Content-Type 的使用

  • 在創(chuàng)建 Blob 時(shí),我們根據(jù)響應(yīng)頭中的 Content-Type 來(lái)設(shè)置 Blob 的 MIME 類型。這使得文件在下載時(shí)能夠被瀏覽器正確識(shí)別和處理:
    const blob = new Blob([response.data], { type: response.headers['content-type'] });
    

3. 文件名的獲取

  • 文件名的獲取邏輯同樣不依賴于文件類型。我們根據(jù) Content-Disposition 頭部或 URL 提取文件名。這樣無(wú)論是 PDF、圖片、文本文件還是其他任何類型的文件,代碼都能正確生成文件名并完成下載。

4. 下載時(shí)的文件處理

  • 瀏覽器會(huì)根據(jù) Blob 的 MIME 類型和下載時(shí)提供的文件名來(lái)決定如何處理文件。例如,對(duì)于 PDF 文件,瀏覽器會(huì)使用 PDF 閱讀器打開(kāi)它,而對(duì)于圖片文件則會(huì)直接展示。

注意事項(xiàng)

  • 特殊文件類型處理:雖然以上代碼可以處理多種類型的文件,但某些文件(如 HTML 文件)可能會(huì)受到瀏覽器的默認(rèn)行為影響。例如,某些文件可能會(huì)直接在瀏覽器中打開(kāi),而不是下載。這是由瀏覽器對(duì)特定 MIME 類型的處理決定的,無(wú)法通過(guò)代碼控制。

  • 服務(wù)器的配置:如果服務(wù)器沒(méi)有正確設(shè)置 Content-Disposition 頭部,或者對(duì)某些文件類型沒(méi)有指定 MIME 類型,可能會(huì)導(dǎo)致文件下載或命名不正確。因此,確保服務(wù)器正確配置是關(guān)鍵。🚀


http://www.risenshineclean.com/news/4699.html

相關(guān)文章:

  • 做網(wǎng)站需要的大圖電商網(wǎng)站策劃
  • 汽車之家這樣的網(wǎng)站怎么做杭州網(wǎng)站運(yùn)營(yíng)十年樂(lè)云seo
  • 微網(wǎng)站制作價(jià)格金華關(guān)鍵詞優(yōu)化平臺(tái)
  • 可不可以用帝國(guó)cms做企業(yè)網(wǎng)站鄭州網(wǎng)站推廣公司
  • 建設(shè)銀行簽名通在網(wǎng)站哪里下載免費(fèi)制作自己的網(wǎng)頁(yè)
  • jq 網(wǎng)站模板技能培訓(xùn)網(wǎng)站
  • 西安哪家網(wǎng)絡(luò)公司做網(wǎng)站小說(shuō)百度搜索風(fēng)云榜
  • 安陽(yáng)工學(xué)院圖書(shū)館找做網(wǎng)站的書(shū)在哪免費(fèi)新聞源發(fā)布平臺(tái)
  • 彩票網(wǎng)站里的統(tǒng)計(jì)怎么做短視頻推廣渠道
  • 房地產(chǎn)網(wǎng)站怎么推廣優(yōu)化軟件下載
  • 2015年做啥網(wǎng)站能致富網(wǎng)絡(luò)營(yíng)銷策劃的概念
  • 網(wǎng)站建設(shè)要考關(guān)鍵詞查詢工具包括哪些
  • 網(wǎng)站首頁(yè)動(dòng)畫(huà)效果怎么弄推廣廣告
  • 怎么看網(wǎng)站日志文件seo官網(wǎng)優(yōu)化
  • 房屋 哪個(gè)網(wǎng)站做的最好百度上的廣告多少錢一個(gè)月
  • 一個(gè)獨(dú)立IP做幾個(gè)網(wǎng)站比較合適seo網(wǎng)站建設(shè)優(yōu)化
  • 人妖和美女做視頻網(wǎng)站如何建立公司網(wǎng)站網(wǎng)頁(yè)
  • 網(wǎng)站建設(shè)合同糾紛問(wèn)題百度廣告聯(lián)盟賺廣告費(fèi)
  • 官方網(wǎng)站建設(shè)要點(diǎn)最近三天的新聞大事簡(jiǎn)短
  • 太平洋保險(xiǎn)網(wǎng)站做的這么爛打廣告推廣怎么做
  • 分類網(wǎng)站建設(shè)方案廣州網(wǎng)站優(yōu)化
  • 怎么找網(wǎng)站模板seo搜索引擎入門教程
  • 網(wǎng)站開(kāi)發(fā)有哪些要求咖啡seo是什么意思
  • 泰安做網(wǎng)站哪家好企業(yè)網(wǎng)站制作方案
  • 浦東新區(qū)網(wǎng)站建設(shè)公司哪家靠譜奇葩網(wǎng)站100個(gè)
  • html 網(wǎng)站地圖北京seo顧問(wèn)推推蛙
  • 臨沂最好的做網(wǎng)站公司網(wǎng)絡(luò)推廣費(fèi)用高嗎
  • 網(wǎng)站開(kāi)發(fā)需要團(tuán)隊(duì)怎么做互聯(lián)網(wǎng)推廣
  • 上海高端定制網(wǎng)站公司河南企業(yè)網(wǎng)站建設(shè)
  • 有人知道網(wǎng)站怎么做嗎海外網(wǎng)站