<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Vue 項目下載文件最佳解決方案

          共 6233字,需瀏覽 13分鐘

           ·

          2022-03-04 21:09

          點擊上方 前端Q,關(guān)注公眾號

          回復(fù)加群,加入前端Q技術(shù)交流群


          開發(fā)中經(jīng)常遇到這樣的功能,用戶將文件或附件上傳到服務(wù)器,后端將文件放到ftp或是其他位置,在前端頁面內(nèi)有下載的入口,有時候,后端返回的是blob,這種情況當然是最好的,但是為了方便,后端也可能返回文件所在位置的url,這時,對前端來說,可能遇到一些問題,比如,下載文件時候瀏覽器可能會出現(xiàn)閃動,下載圖片,json文件等瀏覽器支持的文件時候,不會下載,而是直接在瀏覽器內(nèi)打開這類文件,下面的方法可以完美解決此類問題

          解決方案:

          • 封裝自定義指令
          • 將url轉(zhuǎn)成bold,在創(chuàng)建a標簽下載blob

          代碼實現(xiàn)

          1. 在src 下面的 directive 文件夾下新建目錄 downLoadUrl
          image.png
          1. downLoadUrl / index.js文件
          /*
           * 后端返回文件的url,前端創(chuàng)建a標簽來下載
           *
           *  1. 解決了若文件為圖片或瀏覽器支持的格式類型,點擊下載會直接打開文件的問題,
           *  2. 下載文件時,瀏覽器會有閃動的問題
           *
           *  頁面內(nèi)使用
           *  1. 引入指令 import downLoad from '@/directive/down-load-url'
           *  2. 注冊指令 directives:{downLoad}
           *  3. 使用,在要下載按鈕上以指令的形式使用 例如: <el-button v-downLoad="url">下載</el-button>
           */


          import downLoad from './downLoad'

          const install = function(Vue{
            Vue.directive('downLoadUrl', downLoad)
          }

          downLoad.install = install

          export default downLoad
          復(fù)制代碼
          1. downLoadUrl / downLoad.js文件
          export default {
              bind(el, binding) {
                  if (binding.value.url) {
                      el.addEventListener('click', () => {
                          const a = document.createElement('a')
                          //   let url = baseUrl + binding.value // 若是不完整的url則需要拼接baseURL
                          const url = binding.value.url // 完整的url則直接使用
                          // 這里是將url轉(zhuǎn)成blob地址,
                          fetch(url).then(res => res.blob()).then(blob => { // 將鏈接地址字符內(nèi)容轉(zhuǎn)變成blob地址
                              a.href = URL.createObjectURL(blob)
                              console.log(a.href)
                              a.download = binding.value.name || '' // 下載文件的名字
                              // a.download = url.split('/')[url.split('/').length -1] //  // 下載文件的名字
                              document.body.appendChild(a)
                              a.click()
                              
                              //在資源下載完成后 清除 占用的緩存資源
                              window.URL.revokeObjectURL(a.href);
                              document.body.removeChild(a);
                          })
                      })
                  }
              }
          }
          復(fù)制代碼
          1. main.js注冊自定義指令
          image.png

          使用

          返回一個對象{ url: '', name: ''}

          image.png

          注意

          1、若是文件的url存在跨域的情況,則可能會下載失敗,因為fetch請求連接后,由于跨域,拿不到資源,也就無法執(zhí)行后續(xù)的操作,此時是失敗的。

          2、也可以設(shè)置瀏覽器,對于一下像pdf,圖片等資源不直接打開,直接下載,然后簡單的創(chuàng)建a標簽下載即可。

          image.png

          插件 file-saver 鏈接地址:blog.csdn.net/qq\_30671099…[1]


          關(guān)于本文

          作者:遠航_

          https://juejin.cn/post/7062888582465191944



          往期推薦


          大廠面試官:我理想中的前端
          對話Svelte未來,Rust 編譯器?構(gòu)建大型應(yīng)用?
          收藏!史上最全 Vue 前端代碼風格指南

          最后


          • 歡迎加我微信,拉你進技術(shù)群,長期交流學習...

          • 歡迎關(guān)注「前端Q」,認真學前端,做個專業(yè)的技術(shù)人...

          點個在看支持我吧
          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱爱91| 狠狠干在线观看 | 日韩精品免费一区二区三区夜夜嗨 | 日本在线视频一区二区 | 青青青青青操爽 |