メシのタネ

めしのたねになるIT情報配信サイト


JavaScriptでファイルを作成してブラウザから保存する方法【Blob・IE対応】

, ,

  1. Webプログラム
  2. javascript
  3. JavaScriptでファイルを作成してブラウザから保存する方法【Blob・IE対応】

JavaScriptでFileの作成が手軽にできるようになりました。

ユーザのローカルに任意でDownLoadして貰いたい場合
APIから取ってきたデータをローカルに貯めたい場合
とにかくサーバーにファイル貯めたくない場合

できると嬉しいから、とりあえず手っ取り早くおしえてくれよ!
という意見にお答えします!

JavaScriptってファイル生成できるの?

結論:ブラウザによります。

FileAPIとBlobに対応していれば、生成できます。
IE11(多分10も動作するはず)、Firefox70.0、
Chorome78.0、Edge44では動作しました。
仕様書とか書いている人には申し訳ない。

どういう仕組みでJavaScriptでファイル生成できるの?

感覚を掴んで貰いたいので箇条書きしますね。

ファイルを生成する為の流れ
  • ※BlobURLをJavaScriptで生成する
  • 生成したBlobURLを、aタグのhref属性に設定する
  • ダウンロード属性付けたaタグをクリックする
  • ファイルのダウンロードができる

※BlobURLはダウンロードさせたいデータです

これで感覚は掴めましたでしょうか。
それでは、JavaScriptでファイル作成を行う肝の部分を一緒に勉強していきましょう。

JavaScriptでファイル作成を行う際の肝

せっかくですし、一緒にお勉強しましょう。
コードはよ!って人は画面下部へスクロールしていってください。

Blobを定義する

BlobとはJSのクラスです。
定義しておけば、データの取り扱いが簡単になります。

Blobで定義できるデータをまとめます。

Blobで定義できるデータ
  • ファイル … 画像とか
  • バイナリ … 生データ
    (画像の大きさ変更とかデータの加工とかする時に利用する)
  • 文字列 … 二文字以上の文字
  • html … HyperTextMarkupLanguage

Blobとして定義できるのはこれだけです。
それでは表現方法を見て行きましょう。

var imageData = new Blob([file], { type: "image/png" });
var binaryData = new Blob([binary], { type: "application/octet-binary" });
var stringData = new Blob(["文字列"], { type: "text/plain" });
var htmlData = new Blob(["<html>"], { type: "text/plain;charset=UTF-8" });

BlobURLを生成する

作成したBlobをBlobURL作成する関数の引数に設定します。
BlobURLが生成され、これをデータとしてダウンロードすることができます。

BlobURLの作成は、URL.createObjectURLという関数で行います。
BlobURLをAタグのhref属性にセットすることで、ダウンロードが可能です。
ここまで分かると、コードが書きたくなってきたのではないでしょうか。
次からコードを書いて行きます。

JavaScriptでファイル作成する為のソースコード

この記事の目標は
「最初の方で挙げたブラウザでファイルのダウンロードができるプログラムをJSで作る」です。

その為に行わなければならないことは

  • Blobの定義をすること
  • BlobURLの生成をすること
  • AタグのhrefへBlobURLを付与すること

たったの3つなので、コードも簡単です。

IE向け:msSaveOrOpenBlobでファイルを保存する方法

Internet Explorerなど古いブラウザでは、Blobを直接ダウンロードできないため、 msSaveOrOpenBlob を使ってファイルを保存する必要があります。この記事では、その方法も含めて紹介しています。

<html>
<haed>
	<meta charset="UTF-8" />
</haed>
<script>


function downloadText() {

        // 変更し易いようにパラメータは変数で定義してます。
        // 定数使わない理由はIEで調子崩すような気がして怖いからです。

	var string = 'ダウンロードできたかな?';
	var title = 'testfile.txt';
	var blobType = 'text/plain';

	var linkTagId = 'getLocal';
	var linkTag = document.getElementById(linkTagId);
	var linkTagAttr =  ['href','download'];

	var msSave = window.navigator;

	var stringObject = new Blob([string], { type: blobType });
	var objectURL = window.URL.createObjectURL(stringObject);		

	var UA = window.navigator.userAgent.toLowerCase();

    // UAで判定しなくても、window.navigator.msSaveBlobでの判定も可能
       // ただ、Edgeまで対象になるので、こうしてます。
       // msSave使いたいのは、IEだけです。

	if(UA.indexOf('msie') != -1 || UA.indexOf('trident') != -1) {
                // IEの時はmsSaveOrOpenBlobかmsSaveBlobを利用します。
		window.navigator.msSaveOrOpenBlob(stringObject, title); 
	} else {
		linkTag.setAttribute(linkTagAttr[0],objectURL);
		linkTag.setAttribute(linkTagAttr[1],title);	
	}


};

</script>
<body>
	<a id="getLocal" href="#" onClick="downloadText()">ダウンロードしてね</a>
</body>
</html>

なんとなくレガシーな感じがしますが、各ブラウザで動作します。
ダウンロードしてねをクリックするとダウンロードが開始されますよ。

以上です。JavaScriptは進化していきますね…。

注: この記事は古いため、変数定義がvarですが、現代的にはletまたはconstで変数を定義するのが一般的です。


“JavaScriptでファイルを作成してブラウザから保存する方法【Blob・IE対応】” への2件のフィードバック

  1. 通りすがりのアバター
    通りすがり

    Chromeであればフォルダを扱えるので一度Cドライブなりをinputで読みこめば任意のデータを取れる状況になります。
    それとダウンロードはaタグのdownload属性を利用します。

    1. mikadukiのアバター
      mikaduki

      ご指摘どうもありがとうございます。どうも勘違いしてました。
      別にサーバーにデータが保存できたりローカルに直で保存できるわけではないんですねぇ・・・。

      File API

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

若い頃、「仕事中にハマったこと」や「誰かに共有したい技術的な気づき」をアウトプットしたくてブログを始めましたが、勢い任せでよく分からない記事を大量生産し、あえなく飽きて終了。

改めて今、キャリア15年分の経験や知識が、これからITエンジニアを目指す方や、同じような課題で悩んでいる現役エンジニアの「メシのタネ」になるような記事を残したいと思っています。
※過去の記事は見ると精神が崩壊するため、そっとしておいてください。

🛠 経歴という名の珍道中:
文系Fラン → 広告営業 → Web営業 → 通信営業 → Web進行 → 出版 → Web媒体運用 → ソフトウェアハウス → SES → フリーランス

専門教育も受けず、転職歴も多数。履歴書はまるで時系列の事故記録のようですが、試行錯誤を重ね、なんとかエンジニアとして食べています。

このブログでは、そんな「履歴書クラッシャー型エンジニア」が送る、
名古屋一敷居の低い、実務に役立つ技術ブログを目指します。

PHP
魔王と行く! / Interface / Polymorphism / Ontology 深淵ガイドNew!!
Laravel
Laravel 12、「コード 1 行も書き換えず未来へ」──静かな革命の手順書New!!
Laravel
LaravelのMiddlewareって意味あるの?仕組み・使いどころ・やらかしまで整理してみたNew!!
Laravel
ServiceProviderって何してるの?DIの背後で動いてるやつの正体New!!
Laravel
LaravelのサービスコンテナとDI、「書いてるだけで動く」コードの正体New!!
Laravel
Laravelのアーキテクチャ、実は誰もわかってない説