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

前端vue?a鏈接下載文件失敗的問題(未發(fā)現(xiàn)文件)

 更新時(shí)間:2022年09月15日 15:03:09   作者:偷魚小能手  
這篇文章主要介紹了前端vue?a鏈接下載文件失敗的問題(未發(fā)現(xiàn)文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前端vue a鏈接下載文件失敗(未發(fā)現(xiàn)文件)

錯(cuò)誤案例

發(fā)現(xiàn)出現(xiàn)錯(cuò)誤后,我們?nèi)ハ螺d內(nèi)容里面看我們下載這個(gè)文件的地址

ps:ctrl + j  打開下載內(nèi)容的快捷鍵   適用于 windows系統(tǒng)

 可以發(fā)現(xiàn)這個(gè)文件夾路徑不對(duì)  識(shí)別不了 

我把路徑寫在根目錄下面了 src/assets/...  ,應(yīng)該把你需要下載的文件放在跟src同級(jí)的目錄下或者放在publice目錄里面,反正就是跟     favicon.ico、index.html     這兩個(gè)文件同級(jí)就好了

之后就點(diǎn)擊下載 你如果不放心的話 可以在控制臺(tái)打印你的那個(gè) 地址,把它放在地址欄里面看能否下載下來

完整代碼

html:

 <el-button type="primary" @click="exportBtn">導(dǎo)出模板</el-button>

js:

    // 導(dǎo)出模板
    exportBtn() {
      let link = document.createElement('a');
      link.setAttribute("download", "");
      link.href = "./政策模板導(dǎo)出.xlsx"; // 你本地資源文件的存放地址
      console.log('href:',link.href);
      link.click();
    },

vue點(diǎn)擊下載的避坑指南

引入

今天寫項(xiàng)目時(shí)看到一個(gè)導(dǎo)出功能,看了后端給的接口數(shù)據(jù)發(fā)現(xiàn)跟我想的不太一樣。他給的數(shù)據(jù)亂碼狀,而且直接訪問接口URL會(huì)下載文件本體,我就打算直接a標(biāo)簽下載文件,然而并不行。

避坑之路

查了資料得到了一種寫法,

putOut () {
  const link = document.createElement('a')
  // 創(chuàng)建一個(gè)a標(biāo)簽
  link.style.display = 'none'
    //   // 將a標(biāo)簽隱藏
  link.href = '3*.***.***.*4:****' + '/***/export'
    //   // 給a標(biāo)簽添加下載鏈接  "域名+接口"  safe是一個(gè)動(dòng)態(tài)的域名  后面的接口替換成你自己的下載接口
  link.setAttribute('download', '導(dǎo)出.xlsx')
    //   // 此處注意,要給a標(biāo)簽添加一個(gè)download屬性,屬性值就是文件名稱 否則下載出來的文件是沒有屬性的,空白白
  document.body.appendChild(link)
    //   // 將上面創(chuàng)建的a標(biāo)簽加入到body的尾部
  ink.click()
    //   // 執(zhí)行a標(biāo)簽
 },

這樣寫的話確實(shí)可以下載文件,但是會(huì)出現(xiàn)文件內(nèi)容與后綴名不匹配,文件無法打開的問題。

進(jìn)一步搜了這個(gè)問題得知,這個(gè)與接口給的信息有關(guān),和格式也有關(guān)。基于這一點(diǎn),又寫了一個(gè)方法如下:

putOut () {
      var url = '3*.*.*.*4:*/*/export?response-content-type=application/octet-stream'
      var xhr = new XMLHttpRequest()
      xhr.open('get', url, true)
      xhr.responseType = 'blob' // 返回類型blob
      xhr.onload = function () {
        console.log(this)
        if (this.status === 200) {
          var blob = this.response
          var reader = new FileReader()
          reader.readAsDataURL(blob) // 轉(zhuǎn)換為base64
          reader.onload = function (e) {
            var a = document.createElement('a')
            a.style.display = 'none'
            a.download = '用戶信息.xlsx'
            a.href = e.target.result
            document.body.append(a)
            a.click()
          }
        }
      }
      xhr.send()
    },

這里用到了blob類型,我也是第一次見到,先引用一下這個(gè)數(shù)據(jù)類型的介紹

JavaScript中有一獨(dú)特的專門存放二進(jìn)制數(shù)據(jù)的數(shù)據(jù)類型對(duì)象.叫blob,是從HTML5引入的。blob的英文多稱為Binary Large gbiect、即二進(jìn)制的大型對(duì)象。

File對(duì)象繼承自blob對(duì)象,并有一些額外的拓展功能。

blob對(duì)象

創(chuàng)建方法

利用構(gòu)造函數(shù)Blob(array, options)

  • array:必需,數(shù)組類型,其中數(shù)組元素是二進(jìn)制對(duì)象或者字符串;
  • options:可選,對(duì)二進(jìn)制數(shù)據(jù)的MIME類型說明,包含兩個(gè)屬性, type和endings;

slice(start[, end[, contentType ]]])

從一個(gè)源blob對(duì)象生成一個(gè)新blob對(duì)象,包含了源blob對(duì)象中指定范圍的數(shù)據(jù),以字節(jié)為單位。start:數(shù)據(jù)起始位置,默認(rèn)為0;

  • end:數(shù)據(jù)結(jié)束位置,默認(rèn)為blob對(duì)象的size屬性;
  • contentType:規(guī)定新的blob對(duì)象的MIME類型,即給type屬性傳入該值;

屬性(都是可讀)

  • size:返回當(dāng)前對(duì)象的字節(jié)長(zhǎng)度;type:返回?cái)?shù)據(jù)的MIME類型;

應(yīng)用場(chǎng)景

  • 大文件分段上傳

將大文件用slice()方法切割成段,分段上傳;

  • 通過URL下載文件

創(chuàng)建標(biāo)簽元素,將文件內(nèi)容用blob構(gòu)造函數(shù)創(chuàng)建為blob對(duì)象;

用window對(duì)象的屬性URL對(duì)象的方法createObjectURL(),傳入剛剛創(chuàng)建的blob對(duì)象,返回一個(gè)DOMString對(duì)象,賦予標(biāo)簽元素的href屬性。

設(shè)置標(biāo)簽的download屬性為下載文件的文件名(加文件擴(kuò)展名)。點(diǎn)擊標(biāo)簽即可下載;

由此,進(jìn)一步重寫完成功能,結(jié)合接口信息,代碼變成了這個(gè)樣子

 putOut () {
      this.$axios({
        method: 'get',
        url: '/admin/export',
        // 注意配置響應(yīng)方式 responseType: 'blob'
        responseType: 'blob'
      }).then((res) => {
        console.log(res.data)
        const blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
        console.log(blob)
        var fileName = '用戶信息.xlsx'
        const link = document.createElement('a')
        link.style.display = 'none'
        link.href = URL.createObjectURL(blob)
        link.setAttribute('download', fileName)
        document.body.appendChild(link)
        link.click()
        document.body.removeChild(link)
      }).catch(error => {
        this.$message.error('下載失敗')
        console.log(error)
      })
    },

至此,功能成功實(shí)現(xiàn)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于vue實(shí)現(xiàn)微博三方登錄流程解析

    基于vue實(shí)現(xiàn)微博三方登錄流程解析

    這篇文章主要介紹了基于vue實(shí)現(xiàn)微博三方登錄流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解Vue slot插槽

    詳解Vue slot插槽

    這篇文章主要為大家介紹了Vue的slot插槽,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹

    Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹

    OptionsAPI和CompositionAPI是Vue.js框架中兩種不同的組件編寫方式,OptionsAPI通過對(duì)象字面量定義組件,以屬性分隔不同功能,響應(yīng)式數(shù)據(jù)通過data屬性定義,本文給大家介紹Vue OptionsAPI與CompositionAPI的區(qū)別,感興趣的朋友一起看看吧
    2024-10-10
  • element中el-container容器與div布局區(qū)分詳解

    element中el-container容器與div布局區(qū)分詳解

    這篇文章主要介紹了element中el-container容器與div布局區(qū)分詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 淺談vue 單文件探索

    淺談vue 單文件探索

    這篇文章主要介紹了淺談vue 單文件探索,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • 圖文講解用vue-cli腳手架創(chuàng)建vue項(xiàng)目步驟

    圖文講解用vue-cli腳手架創(chuàng)建vue項(xiàng)目步驟

    本次小編給大家?guī)淼氖顷P(guān)于用vue-cli腳手架創(chuàng)建vue項(xiàng)目步驟講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2019-02-02
  • vue項(xiàng)目如何刪除無用的依賴詳解

    vue項(xiàng)目如何刪除無用的依賴詳解

    vue是目前非常流行的前端開發(fā)框架,隨著技術(shù)的不斷更新,我們也需要更新我們的vue項(xiàng)目,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目如何刪除無用的依賴的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Element Card 卡片的具體使用

    Element Card 卡片的具體使用

    這篇文章主要介紹了Element Card 卡片的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Vue 換膚方案驗(yàn)證

    詳解Vue 換膚方案驗(yàn)證

    這篇文章主要介紹了Vue 換膚方案驗(yàn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • vue實(shí)現(xiàn)前端列表多條件篩選

    vue實(shí)現(xiàn)前端列表多條件篩選

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)前端列表多條件篩選,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論

多伦县| 合川市| 哈密市| 沈阳市| 云林县| 红桥区| 松滋市| 通城县| 台中县| 苗栗县| 神农架林区| 八宿县| 孝感市| 阿拉尔市| 雷波县| 潢川县| 平舆县| 开远市| 南宁市| 盱眙县| 大港区| 乐山市| 黄石市| 镇康县| 泸州市| 竹溪县| 江达县| 龙胜| 电白县| 沾化县| 东台市| 龙南县| 昌乐县| 桑日县| 河源市| 苏州市| 普定县| 隆子县| 阜阳市| 宾阳县| 东城区|