最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue從后端獲取到文件的?url?地址及前端根據(jù)?url?地址下載文件的實現(xiàn)思路

 更新時間:2024年02月03日 10:27:42   作者:YZRHANYU  
這篇文章主要介紹了vue?中從后端獲取到文件的?url?地址及前端根據(jù)?url?地址下載文件,項目用的是?vben?admin?框架,用的是?vue3?+?TS,后端返回的是文件的?url?地址,對vue后端獲取?url?地址的相關(guān)知識感興趣的朋友一起看看吧

前言

項目用的是 vben admin 框架,用的是 vue3 + TS
項目需求數(shù)據(jù)導(dǎo)出功能,前端需要實現(xiàn)文件下載功能
后端返回的是文件的 url 地址 (本項目中返回的是阿里云 oss 的文件地址)

一、實現(xiàn)思路

從后端得到的是一個 url 地址,先通過 fetch api 請求這個 url 地址并轉(zhuǎn)換成 blob 對象,通過 URL.createObjectUrl() 將 blob 對象生成 url 地址,綁定到 <a > 標簽 的 href 屬性上面,結(jié)合 download 來實現(xiàn)點擊 <a > 標簽下載文件

二、具體實現(xiàn)

1.完整代碼

代碼如下:

  function exportData() {
    let data = getForm().getFieldsValue();
    exportTowerHistoryToExcel({ deviceId, createTime: data.startTime }).then((url) => {
	    downLoadFile(url);
    });
  }
	function downLoadFile (url){
      let fileName = url.slice(url.lastIndexOf('/') + 1); // 這里是通過從后端獲取到的 url  地址中截出來原本的文件名
      fetch(url)
        .then((res) => res.blob())
        .then((blob) => {
          const link = document.createElement('a');
          link.href = URL.createObjectURL(blob);
          // 下載文件的名稱及文件類型后綴
          link.download = fileName;
          document.body.appendChild(link);
          link.click();
          //在資源下載完成后 清除 占用的緩存資源
          window.URL.revokeObjectURL(link.href);
          document.body.removeChild(link);
        });
	}

2.代碼分析

2.1 通過 fetch 將 url 地址轉(zhuǎn)換為 blob 對象

以下圖片來自w3cschool文檔 fetch_api

分析

res.blob() 的返回值是什么
從文檔中我們知道res.blob() 返回的并不是一個 blob 對象,而是一個 Promise,繼續(xù) .then 獲取到的才是 blob 對象

res.blob() 到底做了什么
每調(diào)用一次 res.blob() 都會執(zhí)行 consume budy 的動作
執(zhí)行流程大概是這個樣子 : 獲取字節(jié)流的讀取器 --> 通過讀取器來讀取到所有的數(shù)據(jù) --> 將數(shù)據(jù)包裝成 blob 對象并返回

2.2 通過 URL.createObjectUrl() 將 blob 對象生成 url 地址

以下圖片來自MDN文檔 URL.createObjectURL()

分析

URL.createObjURL() 做了什么
我們在調(diào)用 URL.createObjURL() 的時候傳遞的參數(shù)是一個 blob 對象,每次調(diào)用 URL.createObjURL() 的時候,都會創(chuàng)建一個新的 URL 對象
注意 : 即使是用同一個 blob 對象 , 每次調(diào)用 URL.createObjURL() 都會生成不同的 URL 對象

生成的的 URL 對象什么時候會被釋放
瀏覽器在 docoment 卸載的時候,會自動釋放
為了獲得最佳性能和內(nèi)存使用狀況,應(yīng)當在不需要使用這些 URL 對象的安全的實際,主動釋放掉他們

怎么釋放生成的的 URL 對象
通過調(diào)用 URL.removeObjectURL(需要釋放的URL ) 可以來釋放生成的 URL 對象

2.3 創(chuàng)建 <a> 標簽元素,將該元素放到頁面當中,并通過點擊事件來實現(xiàn)下載功能

<a href="xxxxx" rel="external nofollow"  rel="external nofollow" >
<a href="xxxxx" rel="external nofollow"  rel="external nofollow"  download="xxxx">

href:文件的絕對/相對地址
download: 文件名(可省略,省略后瀏覽器自動識別源文件名 , 但是有可能導(dǎo)致自動識別源文件名的時候沒有文件后綴,導(dǎo)致文件沒有格式)

          const link = document.createElement('a');
          link.href = URL.createObjectURL(blob);
          // 下載文件的名稱及文件類型后綴
          link.download = fileName; // 這里 download 可以不寫
          document.body.appendChild(link);
          link.click();

總結(jié)

其實找到這個解決方案的時候直接拿來用挺順利的,但是一開始并不明白它是怎么工作的,甚至每行都沒太明白它為什么這么做,在整理下來的過程中,反而理解了一些東西,與君共勉~

到此這篇關(guān)于vue 中從后端獲取到文件的 url 地址前端根據(jù) url 地址下載文件的文章就介紹到這了,更多相關(guān)vue后端獲取 url 地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3?Transition組件給頁面切換并加上動畫效果

    Vue3?Transition組件給頁面切換并加上動畫效果

    這篇文章主要給大家介紹了關(guān)于Vue3?Transition組件給頁面切換并加上動畫效果的相關(guān)資料,vue的過渡動畫主要是transition標簽的使用,配合css動畫實現(xiàn)的,需要的朋友可以參考下
    2023-06-06
  • Vue3中使用Element-Plus的el-upload組件限制只上傳一個文件的功能實現(xiàn)

    Vue3中使用Element-Plus的el-upload組件限制只上傳一個文件的功能實現(xiàn)

    在 Vue 3 中使用 Element-Plus 的 el-upload 組件進行文件上傳時,有時候需要限制只能上傳一個文件,本文將介紹如何通過配置 el-upload 組件實現(xiàn)這個功能,讓你的文件上傳變得更加簡潔和易用,需要的朋友可以參考下
    2023-10-10
  • el-table點擊某一行高亮并顯示小圓點的實現(xiàn)代碼

    el-table點擊某一行高亮并顯示小圓點的實現(xiàn)代碼

    這篇文章主要介紹了el-table點擊某一行高亮并顯示小圓點,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • vuecli4插件svg-sprite-loader使用svg圖標

    vuecli4插件svg-sprite-loader使用svg圖標

    這篇文章主要為大家介紹了vuecli4插件svg-sprite-loader使用svg圖標示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Vue命令行工具Vue-CLI圖文詳解(推薦!)

    Vue命令行工具Vue-CLI圖文詳解(推薦!)

    vue-cli 是 Vue.js 開發(fā)的標準工具,它簡化了程序員基于 webpack 創(chuàng)建工程化的 Vue 項目的過程,下面這篇文章主要給大家介紹了關(guān)于Vue命令行工具Vue-CLI的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • vue中的Object.freeze()?優(yōu)化數(shù)據(jù)方式

    vue中的Object.freeze()?優(yōu)化數(shù)據(jù)方式

    這篇文章主要介紹了vue中的Object.freeze()優(yōu)化數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 如何修改vant的less樣式變量

    如何修改vant的less樣式變量

    這篇文章主要介紹了如何修改vant的less樣式變量方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 公共Hooks封裝報表導(dǎo)出useExportExcel實現(xiàn)詳解

    公共Hooks封裝報表導(dǎo)出useExportExcel實現(xiàn)詳解

    這篇文章主要為大家介紹了公共Hooks封裝報表導(dǎo)出useExportExcel實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明

    vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明

    這篇文章主要介紹了vue之郵箱、密碼、手機號碼等輸入驗證規(guī)則說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue連接本地服務(wù)器的實現(xiàn)示例

    vue連接本地服務(wù)器的實現(xiàn)示例

    本文主要介紹了vue連接本地服務(wù)器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評論

芜湖县| 闵行区| 西乡县| 抚顺市| 绿春县| 汉沽区| 武乡县| 石城县| 内黄县| 遂平县| 镇原县| 滕州市| 绥中县| 黑河市| 玉门市| 天台县| 东乌珠穆沁旗| 曲松县| 巴青县| 瑞昌市| 准格尔旗| 鞍山市| 伊宁市| 宁强县| 南昌市| 丹凤县| 慈利县| 潮安县| 宜春市| 南郑县| 沂南县| 鲜城| 黄梅县| 宁都县| 仁寿县| 大同市| 长沙市| 阜城县| 商丘市| 麻阳| 长泰县|