JavaScriptのBlobの使い方: データをバイナリデータに変換する
目次
JavaScriptのBlobの使い方
JavaScriptにはBlob(Binary Large Object)
というバイナリデータを扱うためのクラスがあります。
これはimmutable(変更不能)なオブジェクトで、File
に似たクラスです。
Blob
は↓のように使います。
<html> <head> <script> const blob = new Blob(['夏は暑い'], { type: 'text/plain' }) console.log(blob) </script> </head> <body> </body> </html>
出力結果。
Blob
Blobの構造
Blob
のコンストラクタは↓のような構造を持っています。
Blob(データの配列, ファイルの種類(MIMEタイプ))
データの配列(第1引数)
第1引数にはBlob
に変換するデータの配列を渡します。
データの配列とは例えば↓のような配列です。
['この酷暑で', '人類がダウン']
ファイルの種類(MIMEタイプ、第2引数)
第2引数にはデータの種類を文字列のMIMEタイプで指定します。
MIMEタイプについては↓を参照してください。
MIMEタイプは例えば↓のような文字列です。
text/plain
application/json
テキストファイルをBlobでダウンロードさせる
Blob
を使うとユーザーに動的にファイルをダウンロードさせることが可能です。
ダウンロードさせたいデータをBlob
に変換し、リンクを作成します。
ユーザーがそのリンクをクリックすると、Blob
のデータをダウンロードできるという感じです。
↓のHTMLをブラウザで開くとリンクが表示され、リンクをクリックするとファイルがダウンロードされます。
<html> <head></head> <body> </body> <script> // ダウンロードさせたいデータを作成 const blob = new Blob(['日本の夏は暑い'], { type: 'text/plain' }) // ダウンロードリンクを作成 let link = document.createElement('a') // リンクを作成 link.href = URL.createObjectURL(blob) // URLを作成 link.download = '日本の夏について.txt' // ファイル名 link.innerText = 'ダウンロードする' // リンクの表示テキスト // リンクをbodyに追加 document.body.appendChild(link) </script> </html>
URL.createObjectURL
↑のコードでURL.createObjectURL
はなにをやっているのでしょうか?
URL.createObjectURL
は引数のオブジェクトからURLを作成します。
このときオブジェクトはBlob
かFile
のどちらかです。
作成されたURLは現在のdocument
に結び付けられ、そのdocument
が有効なうちはURLをクリックするとそのオブジェクトをダウンロードすることが可能になります。
このURLを開放するにはrevokeObjectURL
を使用します。
つまり↑のコードは作成したリンクのhref
にオブジェクトをダウンロードできるURLを指定しているわけです。
Blobからデータを読み込む
Blob
からデータを読み込むにはFileReader
を使います。
FileReader
のreadAsText
メソッドでBlob
の読み込みを開始し、onload
で読み込みの完了を検知し、内容を出力します。
<html> <head> <script> // Blobを生成 const blob = new Blob(['本日は晴天なり'], { type: 'text/plain' }) // Blobからデータを読み込み const reader = new FileReader() reader.onload = () => { // 読み込みが完了したので結果を出力 console.log(reader.result) } // 読み込み開始 reader.readAsText(blob) </script> </head> <body> </body> </html>
出力結果。
本日は晴天なり
JSON文字列をBlobにする
オブジェクトをパースして文字列にし、その文字列をBlob
に保存することができます。
<html> <head> <script> // オブジェクトを作成 const obj = { name: 'Taro', age: 72, } // オブジェクトをシリアライズ const strObj = JSON.stringify(obj) // シリアライズしたオブジェクトからBlobを作成 const blob = new Blob([strObj], { type: 'application/json' }) // Blobからデータを読み込み const reader = new FileReader() reader.onload = () => { console.log(reader.result) } reader.readAsText(blob) </script> </head> <body> </body> </html>
出力結果。
{"name":"Taro","age":72}
問題
Q1: テキストデータのBlobを作成したいときに適当なタイプを答えよ
text/plain
application/json
html/utf-8
Q2: 作成したBlobからリンクを作成したいときに使用する関数を答えよ
URL.createObjectURL
File.createObjectURL
URL.createBlobURL
@3: Blobからデータを読み込みたいときに使うクラスを答えよ
Reader
FileReader
BlobReader
問題の正解はこちら↓
Q1: 1
Q2: 1
Q3: 2