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

vue 通過base64實現(xiàn)圖片下載功能

 更新時間:2020年12月19日 09:00:55   作者:天使貓  
這篇文章主要介紹了vue 通過base64實現(xiàn)圖片下載功能,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下

1. 使用場景

當我們處理圖片下載功能的時候,如果本地的圖片,那么是可以通過canvas獲得圖片的base64的,方法如下。但是如果圖片的url存在跨域問題的話,下面的方法將行不通,這時候我們可以另辟蹊徑,將后臺的同學,將圖片以base64的形式進行返回。

function getBase64(url){
  //通過構(gòu)造函數(shù)來創(chuàng)建的 img 實例,在賦予 src 值后就會立刻下載圖片,相比 createElement() 創(chuàng)建 <img> 省去了 append(),也就避免了文檔冗余和污染
  var Img = new Image(),
    dataURL='';
  Img.src=url;
  Img.onload=function(){ //要先確保圖片完整獲取到,這是個異步事件
    var canvas = document.createElement("canvas"), //創(chuàng)建canvas元素
      width=Img.width, //確保canvas的尺寸和圖片一樣
      height=Img.height;
    canvas.width=width;
    canvas.height=height;
    canvas.getContext("2d").drawImage(Img,0,0,width,height); //將圖片繪制到canvas中
    dataURL=canvas.toDataURL('image/jpeg'); //轉(zhuǎn)換圖片為dataURL
  };
}

2. 處理base64,進行下載

處理base64的時候有兩點要注意,一個是對ie瀏覽器的處理,一個是對火狐瀏覽器的處理

2-1. 我們首先直接處理base64(基于vue)

1.由于后臺返回的是純base64,如果要完成圖片的下載功能,必須加上一個前綴

<template>
 <a
  :href="prefixBase64 + qrBase64" rel="external nofollow" rel="external nofollow" 
  download="qrcode.png"
  class="qrcode"
 >
  <img src="static/img/load.png">
 </a>
</template>
 
<script>
 ...
 data () {
  return {
   qrBase64: '', // 二維碼對應的base64(在方法里面進行獲取)
   prefixBase64: 'data:image/png;base64,', // base64前綴
  }
 }
 ...
</script>

2.采用這種方式可以很好的支持chrome、Firefox、opera、Safari,但是不支持ie,所以我們下面單獨處理ie瀏覽器

2-2. 處理ie瀏覽器

1.修改代碼如下

<template>
 <a
  @click.stop.prevent="handleDownloadQrIMg"
  class="qrcode"
 >
  <img src="static/img/load.png">
 </a>
</template>
<script>
export default {
 methods: {
  // 點擊下載圖片
  handleDownloadQrIMg() {
   // 這里是獲取到的圖片base64編碼,這里只是個例子哈,要自行編碼圖片替換這里才能測試看到效果
   const imgUrl = this.prefixBase64 + this.qrBase64;
   // 如果瀏覽器支持msSaveOrOpenBlob方法(也就是使用IE瀏覽器的時候),那么調(diào)用該方法去下載圖片
   if (window.navigator.msSaveOrOpenBlob) {
    let bstr = atob(imgUrl.split(",")[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
     u8arr[n] = bstr.charCodeAt(n);
    }
    let blob = new Blob([u8arr]);
    window.navigator.msSaveOrOpenBlob(blob, "chart-download" + "." + "png");
   } else {
    // 這里就按照chrome等新版瀏覽器來處理
    let a = document.createElement("a");
    a.href = imgUrl;
    a.setAttribute("download", "chart-download");
    a.click();
   }
  }
 }
};
</script>

2.ok,ie的問題解決了,但是火狐的又不行了

2-3. 兼容方法

1.結(jié)合上面兩種檢測方法,我們只要可以判斷瀏覽器是火狐,然后單獨處理就可以實現(xiàn)我們的兼容性了

<template>
 <div>
  <a
   v-if="!isFirefox"
   @click.stop.prevent="handleDownloadQrIMg"
   class="qrcode"
  >
   <img src="static/img/load.png">
  </a>
  <a
   v-if="isFirefox"
   :href="prefixBase64 + qrBase64" rel="external nofollow" rel="external nofollow" 
   download="qrcode.png"
   class="qrcode"
  >
   <img src="static/img/load.png">
  </a>
 
 </div>
 
</template>
 
<script>
export default {
 data() {
  return {
   qrBase64: "", // 二維碼對應的base64(在方法里面進行獲?。?
   prefixBase64: "data:image/png;base64,", // base64前綴
   isFirefox: false
  };
 },
 mounted() {
  // 判斷瀏覽器是否是火狐
  if (navigator.userAgent.indexOf("Firefox") > 0) {
   this.isFirefox = true;
  }
 },
 methods: {
  // 點擊下載圖片
  handleDownloadQrIMg() {
   // 這里是獲取到的圖片base64編碼,這里只是個例子哈,要自行編碼圖片替換這里才能測試看到效果
   const imgUrl = this.prefixBase64 + this.qrBase64;
   // 如果瀏覽器支持msSaveOrOpenBlob方法(也就是使用IE瀏覽器的時候),那么調(diào)用該方法去下載圖片
   if (window.navigator.msSaveOrOpenBlob) {
    let bstr = atob(imgUrl.split(",")[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
     u8arr[n] = bstr.charCodeAt(n);
    }
    let blob = new Blob([u8arr]);
    window.navigator.msSaveOrOpenBlob(blob, "chart-download" + "." + "png");
   } else {
    // 這里就按照chrome等新版瀏覽器來處理
    let a = document.createElement("a");
    a.href = imgUrl;
    a.setAttribute("download", "chart-download");
    a.click();
   }
  }
 }
};
</script>

以上就是vue 通過base64實現(xiàn)圖片下載功能的詳細內(nèi)容,更多關(guān)于vue 圖片下載的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Vue項目中封裝組件的簡單步驟記錄

    Vue項目中封裝組件的簡單步驟記錄

    眾所周知組件(component)是vue.js最強大的功能之一,它可以實現(xiàn)功能的復用,以及對其他邏輯的解耦,下面這篇文章主要給大家介紹了關(guān)于Vue項目中封裝組件的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 基于vue--key值的特殊用處詳解

    基于vue--key值的特殊用處詳解

    這篇文章主要介紹了基于vue--key值的特殊用處詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue使用mockjs問題(返回數(shù)據(jù)、get、post 請求)

    Vue使用mockjs問題(返回數(shù)據(jù)、get、post 請求)

    這篇文章主要介紹了Vue使用mockjs問題(返回數(shù)據(jù)、get、post 請求),具有很好的參考價值,希望對大家有所幫助。
    2023-05-05
  • vue3使用Vite打包組件庫從0搭建過程詳解

    vue3使用Vite打包組件庫從0搭建過程詳解

    這篇文章主要為大家介紹了vue3使用Vite打包組件庫從0搭建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • vue-resourse將json數(shù)據(jù)輸出實例

    vue-resourse將json數(shù)據(jù)輸出實例

    這篇文章主要為大家詳細介紹了vue-resourse將json數(shù)據(jù)輸出實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Vue?mergeProps用法詳細講解

    Vue?mergeProps用法詳細講解

    這篇文章主要介紹了Vue?mergeProps用法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • vue設置路由title,但刷新頁面時title失效的解決

    vue設置路由title,但刷新頁面時title失效的解決

    這篇文章主要介紹了vue設置路由title,但刷新頁面時title失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 基于vue.js實現(xiàn)的分頁

    基于vue.js實現(xiàn)的分頁

    本文主要給大家介紹基于vue的分頁原生寫法,代碼分為html部分和js部分,簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • Vue中的v-model,v-bind,v-on的區(qū)別解析

    Vue中的v-model,v-bind,v-on的區(qū)別解析

    vue.js是一套構(gòu)建用戶界面的框架,只關(guān)注視圖層,它不僅易于上手,還便于與第三方庫或既有項目整合,vue.js有配套的第三方類庫,可以整合起來做大型項目的開發(fā),這篇文章主要介紹了v-model,v-bind,v-on的區(qū)別,需要的朋友可以參考下
    2022-12-12
  • 詳解vue中使用express+fetch獲取本地json文件

    詳解vue中使用express+fetch獲取本地json文件

    本篇文章主要介紹了詳解vue中使用express+fetch獲取本地json文件,非常具有實用價值,需要的朋友可以參考下
    2017-10-10

最新評論

华阴市| 繁昌县| 稻城县| 乐陵市| 巴楚县| 上林县| 玉龙| 崇仁县| 永顺县| 宝鸡市| 盖州市| 南昌市| 宜春市| 郑州市| 黔南| 阿拉尔市| 比如县| 商洛市| 太原市| 饶阳县| 绍兴市| 潍坊市| 赣州市| 广安市| 织金县| 克拉玛依市| 老河口市| 金门县| 崇仁县| 阜康市| 杨浦区| 西华县| 榕江县| 景德镇市| 佛教| 武鸣县| 岑巩县| 南阳市| 鸡西市| 理塘县| 清流县|