首頁  >  文章  >  web前端  >  javascript 怎麼實作下載功能

javascript 怎麼實作下載功能

藏色散人
藏色散人原創
2023-02-10 09:18:193765瀏覽

javascript實現下載功能的方法:1、透過a標籤實作下載;2、透過「window.open」方法實現下載;3、透過「location.href」方法實現下載;4、透過檔案流轉blob物件實現下載功能。

javascript 怎麼實作下載功能

本教學操作環境:Windows10系統、javascript1.8.5版本、Dell G3電腦。

javascript 怎麼實作下載功能?

js實作檔案下載功能

一、a標籤下載

<body>
<button onClick="download()">a标签下载</button>
<script>
function download(url = &#39;http:www.xxx.com/download?name=file.pdf&#39;, fileName = &#39;未知文件&#39;) {
      const a = document.createElement(&#39;a&#39;);
      a.style.display = &#39;none&#39;;
      a.setAttribute(&#39;target&#39;, &#39;_blank&#39;);
      /*
       * download的属性是HTML5新增的属性
       * href属性的地址必须是非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目(调用后台的接口),这时download就会不起作用。
       * 此时,如果是下载浏览器无法解析的文件,例如.exe,.xlsx..那么浏览器会自动下载,但是如果使用浏览器可以解析的文件,比如.txt,.png,.pdf....浏览器就会采取预览模式
       * 所以,对于.txt,.png,.pdf等的预览功能我们就可以直接不设置download属性(前提是后端响应头的Content-Type: application/octet-stream,如果为application/pdf浏览器则会判断文件为 pdf ,自动执行预览的策略)
       */
      fileName && a.setAttribute(&#39;download&#39;, fileName);
      a.href = url;
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
</script>
</body>

優點:

  • 可以直接下載txt、png、pdf、exe、xlsx等型別檔

# 缺點:

  • a標籤只能做get請求,所以url有長度限制

  • 無法取得下載進度

  • #跨域限制

  • ##無法在header中攜帶token做鑑權操作

  • 無法判斷介面是否成功

  • IE相容問題

二、window.open下載

<body>
  <button onclick="download(&#39;http://www.xxx.com/download?name=file.pdf&#39;)">window.open下载</button>
  <script>
    function download(url) {
      window.open(url, &#39;_self&#39;);
      /**
       *  _blank:在新窗口显示目标网页
       *  _self:在当前窗口显示目标网页
       *  _top:框架网页中在上部窗口中显示目标网页
      /**
    }
  </script>
</body>

優點:

  • #簡單方便

缺點:

  • 會出現URL長度限制問題

  • 需要注意url編碼問題

  • 無法取得下載進度

  • 無法在header中攜帶token做鑑權運算

  • #無法判斷介面是否成功

  • 無法直接下載瀏覽器可直接預覽的檔案類型(txt、png、pdf會直接預覽)

#三、location.href 下載

<body>
  <button onclick="download(&#39;http://www.xxx.com/download?name=file.pdf&#39;)">location.href下载
  </button>
  <script>
    function download(url) {
      window.location.href = url;
    }
  </script>
</body>

優點

  • #簡單方便直接

  • 可以下載大檔案(G以上)

缺點

  • #會出現URL長度限制問題

  • #需要注意url編碼問題

  • #無法取得下載進度

  • 無法在header中攜帶token做鑑權動作

  • 無法直接下載瀏覽器可直接預覽的檔案類型(txt、png、pdf會直接預覽)

  • 無法判斷介面是否回傳成功

三、檔案流轉blob物件下載

 <button onclick="download()">文件流转blob对象下载</button>
 <script>
 download() {
 axios({
 url: &#39;http://www.xxx.com/download&#39;,
 method: &#39;get&#39;,
 responseType: &#39;blob&#39;,
 }).then(res => {
 const fileName = res.headers.content-disposition.split(&#39;;&#39;)[1].split(&#39;filename=&#39;)[1];
 const filestream = res.data;  // 返回的文件流
 // {type: &#39;application/vnd.ms-excel&#39;}指定对应文件类型为.XLS (.XLS的缩写就为application/vnd.ms-excel)
 const blob = new Blob([filestream], {type: &#39;application/vnd.ms-excel&#39;});
 const a = document.createElement(&#39;a&#39;);
 const href = window.URL.createObjectURL(blob); // 创建下载连接
    a.href = href;
    a.download = decodeURL(fileName );
    document.body.appendChild(a);
        a.click();
        document.body.removeChild(a); // 下载完移除元素
        window.URL.revokeObjectURL(href); // 释放掉blob对象
 })
 }
 </script>

優點:

  • 可以下載txt、png、pdf等類型檔案

  • 可以在header中攜帶token做鑑權運算

  • 可以取得檔案下載進度

  • 可以判斷介面是否回傳成功

缺點:

  • 相容性問題,IE10以下不可用,注意Safari瀏覽器,官網給出Safari has a serious issue with blobs that are of the type application/octet-stream

  • #將後端傳回的檔案流全部取得後才會下載

推薦學習:《

JavaScript影片教學

以上是javascript 怎麼實作下載功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn