JavaScriptでファイルダウンロードを実現するための5ステップ

今回は、JavaScriptだけでファイルダウンロードを実現したので、その方法を紹介していくよ。

1,まずはHTMLを作成

まずは、ひな形となるhtmlファイルを作成する。今回はシンプルな構造でbodyにはaリンクのみ配置している。

<html lang="ja">
<head>
        <meta charset="utf-8">
        <title>Download Sample</title>
    </head>
<body>
<a href="#" id="download"><span class="synUnderlined">Click Me!</a>
</body>
</html>

2,addEventListenerを追加する。

次にaリンクに対して、javaScriptでaddEventListenerメソッドを追加する。(今回は、</body>の後にコードを追加)

.
.
</body>
<script>
  function downloadFile(e) {
}
document.getElementById('download').addEventListener('click',  downloadFile, false);
</script>

本来はhtmlとjavaScriptはファイル毎に分けるべきだが、今回はサンプルと言う事で一緒のファイルにまとめている。

また、downloadFile(e)関数の引数のeはイベントの要素自身を指している。(今回はaリンク。)

参考記事:EventTarget.addEventListener() - Web API | MDN

3, downloadFile()関数内にダウンロードに必要な処理を書き込む

いよいよdownloadFile()関数内に必要な処理を書き込んでいく。 まずは、この2行を書く。

 function downloadStart(e) {
var content = 'simple is best';
var blob = new Blob([content], {type: "text/plain"});
}

content変数にはファイルとして出力したい文字列を格納する。 2行目のnew Blobオブジェクトは、ファイルに似たようなオブジェクトを作成できるものであり、JavaScriptではFileオブジェクトと似たような働きをしてくれる。

参考記事:Blob - Web API | MDN

参考記事:File - Web API | MDN

Blobオブジェクトは第一引数は配列として格納し、第2引数以降はオプションで様々な設定ができる。

4,aリンクのhrefを書き換える

Blobオブジェクトでファイルっぽいオブジェクトを作成した後は、リンクのurlをBlobオブジェクトのurlに書き換える作業を行う。

 function downloadStart(e) {
var content = 'simple is best';
var blob = new Blob([content], {type: "text/plain"});
e.target.href = window.URL.createObjectURL(blob);
}

URL.createObjectURL()メソッドを使い事で、引数(blob)のオブジェクトのURLを作成してくれるので、そのURLをリンクのURLに挿入している。

参考記事:URL.createObjectURL - Web API | MDN

5,ファイルとしてダウンロードできるようにする

ここまでの作業を経て実行してみると、リンクをクリックするとsimple is bestと言う画面が表示されて、上のアドレスバーのURLもdate:~に変わるはず。

しかし、きちんとファイルとしてダウンロードできるようにするためにも、aタグにdownloadと言うattributeを書き加えよう。

<a href="#" id="download" download><span class="synUnderlined">Click Me!</a>

このdownloadと言うattributeはhtml5から追加されたもので、リンク先をファイルとしてダウンロードできるようにしてくれるものだ。

参考記事:HTML a download Attribute

また、ダウンロードするファイル名を変更したい場合は以下の様に書くと良い。

<a href="#" id="download" download='text.txt'><span class="synUnderlined">Click Me!</a>

上記のコードで、text.txtと言うファイル名でダウンロードができるようになるはず。