HTML5とJavaScriptでファイルを生成・保存する方法
HTML5とJavaScriptを使ってファイルを生成・保存する方法
このチュートリアルでは、HTML5とJavaScriptを使って、クライアント側でファイルを生成して保存する方法を解説します。主に以下の2つの方法を紹介します。
- Blob APIを使う
- Data URIを使う
それぞれの方法について、詳細な説明とコード例、そしてそれぞれの長所と短所を解説します。
概要
Blob APIは、JavaScriptでバイナリデータを扱うためのAPIです。ファイルの生成と保存にも利用できます。この方法では、以下の手順でファイルを生成・保存します。
- 生成したいファイルの内容を、JavaScriptで変数に格納します。
Blob()
コンストラクタを使って、変数の内容をBlobオブジェクトに変換します。URL.createObjectURL()
を使って、BlobオブジェクトからURLを生成します。a
要素を作って、href
属性に生成したURLを設定します。- ユーザーが
a
要素をクリックすると、ファイルがダウンロードされます。
コード例
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
</head>
<body>
<a id="downloadLink" href="#" download="sample.txt">ファイルをダウンロード</a>
<script>
const downloadLink = document.getElementById('downloadLink');
// 生成したいファイルの内容を文字列として定義
const textContent = 'これはサンプルテキストです。';
// Blobオブジェクトを作成
const blob = new Blob([textContent], {type: 'text/plain'});
// BlobオブジェクトからURLを生成
const url = URL.createObjectURL(blob);
// ダウンロードリンクのhref属性にURLを設定
downloadLink.href = url;
</script>
</body>
</html>
長所
- 比較的汎用性が高い
- バイナリデータだけでなく、テキストデータも扱える
- ファイル名やMIMEタイプを自由に設定できる
短所
- ユーザーがファイルを保存する前に、ダウンロードダイアログが表示される
- 一部の古いブラウザでは動作しない可能性がある
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
</head>
<body>
<a id="downloadLink" href="data:text/plain;charset=utf-8,これはサンプルテキストです。">ファイルをダウンロード</a>
</body>
</html>
- シンプルで記述量が少ない
- 扱えるデータ量が小さい(一般的には数メガバイト程度)
以下の表を参考に、状況に応じて適切な方法を選択してください。
状況 | Blob API | Data URI |
---|---|---|
汎用性が必要 | ○ | × |
バイナリデータを含むファイルを扱う | ○ | × |
ファイル名やMIMEタイプを自由に設定したい | ○ | × |
データ量が少ない | × | ○ |
シンプルな記述で済ませたい | × | ○ |
補足
- 上記のコード例はあくまでも基本的な例です。実際の使用状況に合わせて、適宜カスタマイズする必要があります。
- ファイルを保存する機能は、セキュリティ上のリスクを伴う可能性があります。適切な対策を講じて使用するようにしてください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
</head>
<body>
<a id="downloadLink" href="#" download="sample.txt">ファイルをダウンロード</a>
<script>
const downloadLink = document.getElementById('downloadLink');
// 生成したいファイルの内容を文字列として定義
const textContent = 'これはサンプルテキストです。';
// Blobオブジェクトを作成
const blob = new Blob([textContent], {type: 'text/plain'});
// BlobオブジェクトからURLを生成
const url = URL.createObjectURL(blob);
// ダウンロードリンクのhref属性にURLを設定
downloadLink.href = url;
</script>
</body>
</html>
このコードの説明
- HTML部分
- JavaScript部分
const downloadLink = document.getElementById('downloadLink');
: ダウンロードリンクの要素を取得します。const textContent = 'これはサンプルテキストです。';
: 生成したいファイルの内容を文字列として定義します。const blob = new Blob([textContent], {type: 'text/plain'});
: Blobオブジェクトを作成します。[textContent]
: Blobオブジェクトに含めるデータを渡します。{type: 'text/plain'}
: ファイルの種類をテキストファイル(plain text)に設定します。
downloadLink.href = url;
: ダウンロードリンクのhref
属性にURLを設定します。
- ユーザーがダウンロードリンクをクリックすると、ブラウザは
Blob
オブジェクトから生成されたURLを解釈し、ファイルをダウンロードします。 - ファイル名は、ダウンロードリンクの
download
属性で指定された 「sample.txt」 になります。 - ファイルの内容は、JavaScriptで定義された 「これはサンプルテキストです。」 になります。
しかし、状況によっては、以下のような他の方法も検討することができます。
FileSaver.jsを使う
FileSaver.jsは、JavaScriptライブラリの一つで、Blob APIの機能をより簡単に使えるようにするものです。Blob APIと同様に、ファイルを生成して保存することができます。
- Blob APIよりもコードがシンプルでわかりやすい
- 一部の古いブラウザでも動作する(Polyfillとして利用可能)
- 別途ライブラリの読み込みが必要
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>
</head>
<body>
<button id="saveButton">ファイルを保存</button>
<script>
const saveButton = document.getElementById('saveButton');
// 生成したいファイルの内容を文字列として定義
const textContent = 'これはサンプルテキストです。';
// Blobオブジェクトを作成
const blob = new Blob([textContent], {type: 'text/plain'});
// FileSaver.jsを使ってファイルを保存
saveButton.addEventListener('click', () => {
saveAs(blob, 'sample.txt');
});
</script>
</body>
</html>
FileReader APIを使う
FileReader APIは、JavaScriptでファイルを非同期的に読み込むためのAPIです。このAPIを使って、既存のファイルをメモリ上に読み込み、その内容を加工して新しいファイルとして保存することができます。
- 既存のファイルを加工して新しいファイルを生成できる
- Blob APIやData URIよりも複雑な処理が必要
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
</head>
<body>
<input type="file" id="fileInput">
<button id="saveButton">ファイルを保存</button>
<script>
const fileInput = document.getElementById('fileInput');
const saveButton = document.getElementById('saveButton');
// ファイルを選択したときの処理
fileInput.addEventListener('change', (event) => {
const file = event.target.files[0];
// ファイルの内容を非同期的に読み込む
const reader = new FileReader();
reader.onload = (event) => {
const textContent = event.target.result;
// 読み込んだ内容を加工して新しいファイルとして保存
const processedContent = textContent.replace('サンプル', '新しいサンプル');
const blob = new Blob([processedContent], {type: 'text/plain'});
saveAs(blob, 'new_sample.txt');
};
reader.readAsText(file);
});
</script>
</body>
</html>
WebAssemblyを使う
WebAssemblyは、Webブラウザで実行できるバイナリ形式のファイルです。C/C++などの言語で記述されたコードをWebAssemblyに変換することで、高速な処理を行うことができます。
- 非常に高速な処理が可能
- 複雑な処理にも対応できる
- 学習曲線が険しい
- ファイルサイズが大きくなる傾向がある
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>ファイル生成・保存</title>
<script src="wasm_module.js"></script>
</head>
<body>
<button id="saveButton">ファイルを保存</button>
<script>
const saveButton = document.getElementById('saveButton');
// 生成したいファイルの内容を文字列として定義
const textContent = 'これはサンプルテキストです。';
// WebAssemblyモジュールをロード
const wasm = await WebAssembly.instantiateStreaming(fetch('wasm_module.wasm'));
// WebAssemblyモジュールから生成された関数を呼び出す
const processed
javascript html download