使用 JavaScript 下載檔案

Harshit Jindal 2023年1月30日
  1. 使用 HTML 中的 download 屬性下載檔案
  2. 在 JavaScript 中使用自定義函式建立和下載文字檔案
  3. 使用 Axios 庫下載檔案
使用 JavaScript 下載檔案

在本文中,我們將學習如何使用 JavaScript 下載檔案。自動下載檔案可幫助我們使用 JavaScript 函式直接從 URL 檢索檔案,而無需聯絡任何伺服器。我們將使用自定義的編寫函式並使用 HTML 5 的下載屬性來實現此目的。

使用 HTML 中的 download 屬性下載檔案

當使用者單擊超連結時,HTML 5 中的 download 屬性用於下載檔案。它與錨標籤-<a><area> 一起使用。我們需要設定 href 屬性,以指定檔案的來源。download 屬性的值確定下載檔案的名稱。如果刪除此值,則下載的檔名將與原始檔名相同。

<!DOCTYPE html> 
<html> 
<head>
	<title>How to Download files Using JavaScript </title>
</head>
   <body>     
         <a href="apple.png" download="apple">
         <button type="button">Download</button> 
         </a> 
   </body> 
</html> 

在上面的程式碼中,我們使用 download 屬性下載影象 apple.png。我們首先建立包含影象地址的錨標籤,然後向其新增 download 屬性。然後,我們還建立了一個下載按鈕,以方便下載檔案。

在 JavaScript 中使用自定義函式建立和下載文字檔案

這種方法將動態建立文字資料,然後使用 JavaScript 建立文字檔案然後下載。

下載演算法

  • 建立一個文字區域以輸入文字資料。
  • 使用 createElement 屬性建立錨標籤 <a>,併為其分配 downloadhref 屬性。
  • 使用 encodeURIComponent 編碼文字並將其附加到 URI 作為其組成部分。這將幫助我們用轉義序列的組合替換某些特殊字元。
  • 將日期型別設定為 text/plain,並使用 data:text/plain; charset = utf-8 作為 href 的屬性值。
  • 將此建立的元素追加到文件(HTML 頁面)的正文中。
  • 使用 element.click() 模擬滑鼠單擊。
  • 從文件正文(HTML 頁面)中刪除元素。

附加事件偵聽器,以查詢單擊下載按鈕的過程。使用文字區域中的文字和文字檔案的檔名作為引數來呼叫下載功能。

<!DOCTYPE html>
<html>

<head>
      <title>
            How to Download files Using JavaScript
      </title>
</head>

<body>

      <textarea id="text">DelftStack</textarea>
      <br />
      <input type="button" id="btn" value="Download" />
      <script>
            function download(filename, textInput) {

                  var element = document.createElement('a');
                  element.setAttribute('href','data:text/plain;charset=utf-8, ' + encodeURIComponent(textInput));
                  element.setAttribute('download', filename);
                  document.body.appendChild(element);
                  element.click();
                  //document.body.removeChild(element);
            }
            document.getElementById("btn")
                  .addEventListener("click", function () {
                        var text = document.getElementById("text").value;
                        var filename = "output.txt";
                        download(filename, text);
                  }, false);
      </script>
</body>

</html>

使用 Axios 庫下載檔案

在這種方法中,我們將使用 Axios 庫下載檔案。在繼續介紹該方法的詳細資訊之前,讓我們瞭解什麼是 Blob,這是用於使用 Axios 下載檔案的資料型別。

Blob

Blob 代表 Binary Large Object,是一種可以儲存二進位制資料的資料型別。它表示程式、程式碼片段、多媒體物件之類的資料,以及不支援 JavaScript 本機格式的其他內容。

下載檔案

  • 建立一個 Axios get 請求,其中 URL 為檔案源,而 responseTypeblob
  • 通過執行以下步驟來解決 Axios 請求返回的承諾:
    • 建立一個包含代表 Blob 物件的 URL 的 DOMString。
    • 使用 createElement 屬性建立錨標籤 <a>,併為其分配 downloadhref 屬性。
    • href 設定為第一步中建立的 URL,將 download 屬性設定為下載檔案的名稱。
    • 將此連結附加到文件,並使用 .click() 方法模擬點選。
    • 從文件中刪除此連結。
<!DOCTYPE html>
<html>

<head>
      <title>How to download files using JavaScript</title>
</head>

<body>
      <button onclick="download()">
            Download Image
      </button>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.min.js">
      </script>
      <script>
            function download() {
                  axios({
                        url: 'https://source.unsplash.com/random/500x500',
                        method: 'GET',
                        responseType: 'blob'
                  })
                        .then((response) => {
                              const url = window.URL
                                    .createObjectURL(new Blob([response.data]));
                              const link = document.createElement('a');
                              link.href = url;
                              link.setAttribute('download', 'image.jpg');
                              document.body.appendChild(link);
                              link.click();
                              document.body.removeChild(link);
                        })
            }

      </script>
</body>

</html>

在這裡,我們從一個網站獲得隨機的圖片,使用 Axios 來請求這些圖片的 blob 形式,然後使用錨標籤的 download 屬性下載它們。與以前的方法一樣,此方法不限於使用者輸入的純文字。我們可以從 API 請求任何種類的資料,然後使用這種方法將資料儲存在計算機內部。

除使用 Axios 庫的方法外,所有主流瀏覽器均支援上述所有方法。Internet Explorer 仍然不支援本機 ES6 承諾,而 Axios 嚴重依賴它們。

作者: Harshit Jindal
Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

相關文章 - JavaScript File