JavaScript によるファイルのダウンロード

Harshit Jindal 2023年1月30日
  1. HTML の download 属性を使用してファイルをダウンロードする
  2. JavaScript でカスタム作成関数を使用してテキストファイルを作成およびダウンロードする
  3. Axios ライブラリを使用してファイルをダウンロードする
JavaScript によるファイルのダウンロード

この記事では、JavaScript を使用してファイルをダウンロードする方法を学習します。ファイルの自動ダウンロードは、サーバーに接続せずに JavaScript 関数を使用して URL から直接ファイルを取得するのに役立ちます。これは、カスタムで記述された関数と HTML5 のダウンロード属性を使用して実現します。

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> を作成し、それに download 属性と href 属性を割り当てます。
  • encodeURIComponent を使用してテキストをエンコードし、そのコンポーネントとして URI に追加します。これは、特定の特殊文字をエスケープシーケンスの組み合わせに置き換えるのに役立ちます。
  • href の属性値として data:text/plain; charset = utf-8 を使用して、日付タイプを text/plain に、エンコーディングを UTF-8 に設定します。
  • この作成された要素をドキュメントの本文(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 ライブラリを使用してファイルをダウンロードします。アプローチの詳細に進む前に、Axios を使用してファイルをダウンロードするために使用されるデータ型である Blob とは何かを理解しましょう。

Blob

BlobBinary Large Object の略で、バイナリデータを格納できるデータ型です。これは、プログラム、コードスニペット、マルチメディアオブジェクト、および JavaScript ネイティブ形式をサポートしないその他のものなどのデータを表します。

ファイルのダウンロード

  • ファイルのソースとして URL を使用し、blob として responseType を使用して、Axios の get リクエストを作成します。
  • 次の手順を実行して、Axios リクエストによって返された promise を解決します。
    • Blob オブジェクトを表す URL を含む DOMString を作成します。
    • createElement プロパティを使用してアンカータグ <a> を作成し、それに download および href 属性を割り当てます。
    • 最初のステップで作成した URL として href を設定し、ダウンロードしたファイルの名前として 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