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
と言うファイル名でダウンロードができるようになるはず。