js如何下載后台傳過來的base64文件


一、<a>標簽的作用

  相信大部分人都知道<a>鏈接再簡單不過了,跳轉嘛,跳轉到另外一個頁面,這誰不知道。

當然這這是一部分, <a> 標簽定義超鏈接,用於從一個頁面鏈接到另一個頁面。<a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。大家所熟知的一部分,

其實還有 如果將<a>鏈接加上download,那么一切都有點不一樣了。

比如:<a href="https://www.baidu.com/img/baidu_jgylogo3.gif" download>下載 百度的圖片</a>

  <a href="https://www.baidu.com/img/baidu_jgylogo3.gif" download="牛逼.png">下載 百度的圖片</a>   ///   如果為download賦值,即相當於為下載文件命名

 大家可以在編輯器里面試試。雖然它還是鏈接,但可點擊這個鏈接,然后把一個資源下載下來,而不是再像以往用瀏覽器打開。

有了這個功能,我們就可以做一些事了。

 

二、new FileReader()

  在做點特別的事前我們再來看看這個 api; new FileReader(),光看起來就像一個文件什么的東東對吧,其實它是一個下載文件的構造函數。將后台傳過來的base64字符串轉碼成文件

那到底有什么用呢,你可能這樣問,很明顯了嘛,配合我們的  <a> 標簽,不就是想下什么下載什么不。比如你想去個什么....網站(嘿嘿)

既然做下載我們就只關注它幾個和文件下載有關的方法。

  readAsBinaryString  將文件讀取為二進制碼

  readAsDataURL     將文件讀取為 DataURL (這也是例子程序中用到的方法)

  readAsText   [encoding] 將文件讀取為文本

  readAsText:該方法有兩個參數,其中第二個參數是文本的編碼方式,默認值為 UTF-8。這個方法非常容易理解,將文件以文本方式讀取,讀取的結果即是這個文本文件中的內容。

  readAsBinaryString:該方法將文件讀取為二進制字符串,通常我們將它傳送到后端,后端可以通過這段字符串存儲文件。

  readAsDataURL:這是例子程序中用到的方法,該方法將文件讀取為一段以 data: 開頭的字符串,這段字符串的實質就是 Data URL,Data URL是一種將小文件直接嵌入文檔的方案。這里的小文件通常是

指圖像與 html 等格式的文件。

 

在常規 HTTP 響應中,Content-Disposition響應標頭是指示內容是否預期在瀏覽器中內聯顯示的標題,即,作為網頁或作為網頁的一部分或作為附件下載並且本地保存。

在一個multipart/form-data正文中,HTTP Content-Disposition通用標題是一個標題,可以在多部分主體的子部分中使用,以提供有關它適用的字段的信息。子部分由標題中定義的邊界分隔Content-Type。用於身體本身,Content-Disposition沒有任何作用。(單純是個名字而已,嫌麻煩可忽略,雖然會用到,但是不妨礙它沒用....

 下面直接擼干貨::

  此處省略一萬行代碼,這樣看起來像大牛.....haha

  ajax請求后,記得返回需為 blob格式文件

  ajax......then(res => {

    let reader = new FileReader();

              reader.readAsDataURL(res.bodyBlob); // 轉換為base64,可以直接放入a標簽href

              reader.onload = function (e) {
                   // 轉換完成,還記得我們上文的<a>標簽嗎,動態創建一個a標簽用於下載
                   let a = document.createElement('a');

      let fileName = '' ;      //下載總得有個名字吧。

      if (res.headers.map['Content-Disposition'] !=  null && res.headers.map['Content-Disposition'].length > 0) {

         fileName = res.headers.map['Content-Disposition'][0];

              } else if (res.headers.map['content-disposition'] != null && res.headers.map['content-disposition'].length > 0) {

        fileName = res.headers.map['content-disposition'][0];

            } else {

          fileName = excel.xlsx;

            }

                   fileName = fileName.substring(fileName.lastIndexOf(".")); // 一般從后台傳過來的值我們都得修改的,截取想要的文件名,當然視情況而定,萬一不用改呢

        a.download = fileName;  //   貼心的為 <a>標簽的 download 賦個值 其實是這樣了  <a download="fileName"> </a>

             a.href = e.target.result;     //   貼心的為 <a>標簽的href 賦個值    其實是這樣了  <a  href="e.target.result"  download="fileName"> </a> 是不是和上文一樣,只需小手輕輕一按。

       但是<a>里面沒值找不到?沒關系讓瀏覽器來,先加到瀏覽器里  

         // $("body").append(a);    // 修復firefox中無法觸發click,如果firefox下載不了,我是沒問題

        document.querySelector("body").appendChild(a);

        a.click();   ///      再

       // $(a).remove();    修復firefox中無法觸發click,如果firefox下載不了,我是沒問題

       document.querySelector("body").removeChild(a);      //   用完即拋棄,內存很小的

  })

   

 

    原創文章,轉載請附鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM