TIPS 056:バイナリファイルを読み込む(2)
FileReaderオブジェクトには、もうひとつバイナリファイルを読み込むための
readAsBinaryStringメソッドが用意されています。
例えば以下は、TIPS 055のサンプルをreadAsBinaryStringメソッドで書き換えたものです。
[リスト04]画像ファイルの内容を表示(readBinary.html)
02 | window.addEventListener('DOMContentLoaded', function() { |
03 | // ファイルが指定されたタイミングで、その内容を表示 |
04 | document.querySelector("#file").addEventListener('change', function(e) { |
05 | // File APIを利用できるかをチェック |
08 | var input = document.querySelector('#file').files[0]; |
10 | var reader = new FileReader(); |
11 | // ファイルの読み込みに成功したら、その内容を<img id="result">に反映(2) |
12 | reader.addEventListener("load", function(event){ |
14 | var raw = reader.result; |
17 | // バイナリデータを順に取得(0xffとの論理積でバイト値に変換(1)) |
18 | for (var i = 0; i < raw.length; i++){ |
19 | bytes[i] = raw.charCodeAt(i) & 0xff; |
21 | // Base64エンコードしたものをData URL形式に整形(2) |
22 | document.querySelector('#result').src = "data:" + input.type |
23 | + ";base64," + btoa(String.fromCharCode.apply(String, bytes)); |
25 | reader.readAsBinaryString(input); |
readAsBinaryStringメソッドは、生のバイナリデータを取得しますので、サンプルではこれをバイト配列に変換した上で(1)、更にこれを文字列変換し、最終的に、btoaメソッドでBase64エンコードしています(2)。これは、バイナリデータからバイト文字列を得る定型的な流れです。Base64エンコードできてしまえば、あとは「data:[コンテンツタイプ][;base64],データ本体」の構文に従って、Data URLを組み立てるだけです。
サンプルを見てもわかるように、取得したデータをそのまま
、
TIPS 057:ファイル読み込みに失敗した場合の処理を定義する
FileReaderオブジェクトにerrorイベントリスナーを登録しておくことで、ファイルの読み込みに失敗した場合に、エラーメッセージの表示などのエラー処理を行えます。
[リスト05]読み込みエラー時にエラーメッセージを表示(readError.html)
02 | window.addEventListener('DOMContentLoaded', function() { |
03 | // ファイルが指定されたタイミングで、その内容を表示 |
04 | document.querySelector("#file").addEventListener('change', function(e) { |
05 | // File APIを利用できるかをチェック |
08 | var input = document.querySelector('#file').files[0]; |
09 | var reader = new FileReader(); |
10 | reader.readAsDataURL(input); |
11 | reader.addEventListener('load', function(e) { |
12 | document.querySelector('#result').src = reader.result; |
15 | reader.addEventListener('error', function(e) { |
16 | // エラーコードに対応するメッセージを準備(1) |
25 | // エラーコードに応じてメッセージを表示(2) |
26 | document.querySelector('#err').innerHTML = errors[reader.error.code]; |
errorイベントリスナーの中では、error.codeプロパティでエラーコードにアクセスできます。エラーコードの意味は、以下のとおりです。
表4:error.codeプロパティの値
エラーコード |
概要 |
1 |
指定のファイルが存在しない |
2 |
権限エラー(読み取り権限を持たないなど) |
3 |
ファイルの読み込みを中断された |
4 |
読み込み中のエラー |
5 |
ファイルサイズが許容上限を超えた |
サンプルでは、エラーコード1~5に対応するエラーメッセージを配列errorsにセットしておくことで(1)、codeプロパティの値に応じてメッセージを返しているわけです(2)。例えばエラーコード1で、erros[1]が取り出されます。
TIPS 058:ファイル読み込み時の進捗状況を表示する
読み込みの状況を追跡するには、progressイベントを利用します。progressイベントは、ファイル読み込みの開始から終了までの間、連続して発生するイベントです。
以下では、このprogressイベントを利用して、ファイルの読み込み状況を「●○%読み込み済み」のように、テキストで表示します。
[サンプル]読み込み率をテキスト表示するコード(readProgress.html)
04 | <meta charset="UTF-8" /> |
05 | <title>HTML5 TIPS</title> |
07 | window.addEventListener('DOMContentLoaded', function() { |
08 | // ファイルが指定されたタイミングで、その内容を表示 |
09 | document.querySelector("#file").addEventListener('change', function(e) { |
13 | var input = document.querySelector('#file').files[0]; |
15 | var reader = new FileReader(); |
16 | // ファイルの読み込みに成功したら、その内容を<img id="result">に反映 |
17 | reader.addEventListener('load', function(e) { |
18 | document.querySelector('#result').src = reader.result; |
22 | reader.addEventListener('progress', function(e) { |
23 | // 「ロード済みサイズ÷総サイズ」で読み込み率を求める |
24 | document.querySelector('#prog').innerHTML = |
25 | Math.floor(e.loaded /e.total * 100); |
28 | // ファイルの内容をData URL形式で取得 |
29 | reader.readAsDataURL(input); |
37 | <input id="file" name="file" type="file" /> |
39 | <span id="prog" style="color:Blue;">0</span>%読み込み済み |
図4:ファイル読み込みの進捗をパーセント表示
progressイベントリスナーの中では、totalプロパティでファイルの総サイズを、loadedプロパティで読み込み済みのサイズを、それぞれ取得できます。そこでサンプルでは、「loaded ÷ totaled × 100」という式で、読み込み済みのサイズ割合を求めています。progressイベントは、ファイルの読み込み中に連続して発生しますので、サンプルのようなリスナーを設けておくことで、読み込み割合が徐々に増えていく効果を実装しています。