1. はじめに
このセクションは参考情報です。
ウェブアプリケーションは、ユーザーがリモートサーバーにアップロードしたいファイルや、リッチなウェブアプリケーション内で操作したいファイルなど、できるだけ幅広いユーザー入力を操作できる能力を持つべきです。 本仕様は、ファイルの基本的な表現、ファイルリスト、ファイルアクセスによって発生するエラー、およびファイルをプログラムで読み取る方法を定義します。 さらに、本仕様は「生データ」を表すインターフェイスも定義しており、現行標準に準拠したユーザーエージェントのメインスレッドで非同期的に処理できます。 本仕様で定義されるインターフェイスやAPIは、ウェブプラットフォームで公開されている他のインターフェイスやAPIと組み合わせて利用できます。
File
インターフェイスは通常、基盤となるファイルシステムから取得したファイルデータを表し、
Blob
インターフェイス
(「Binary Large Object」— この名称は Google Gears
でウェブAPIに初めて導入されました)
は変更不可能な生データを表します。File
や Blob
の読み込みは、メインスレッド上で非同期的に行うべきであり、スレッド化されたウェブアプリケーション内ではオプションで同期APIも利用できます。
ファイルの非同期APIを利用することで、ユーザーエージェントのメインスレッドがブロックされたり、UIが「フリーズ」するのを防げます。
本仕様は、イベントモデルに基づいた非同期APIを定義し、File
や Blob
のデータを読み取ったりアクセスできます。
FileReader
オブジェクトは、イベントハンドラーの内容属性やイベント発火により、ファイルデータへ非同期的にアクセスするための読み取りメソッドを提供します。
イベントやイベントハンドラーを用いることで、別々のコードブロックが読み取りの進捗(特にリモートドライブやマウントされたドライブなど、ファイルアクセスのパフォーマンスがローカルドライブとは異なる場合)や読み込み時に発生するエラー状況を監視できます。
下記の例が参考になります。
function startRead() { // DOMからinput要素を取得 var file= document. getElementById( 'file' ). files[ 0 ]; if ( file){ getAsText( file); } } function getAsText( readFile) { var reader= new FileReader(); // ファイルをUTF-16としてメモリに読み込む reader. readAsText( readFile, "UTF-16" ); // 進捗・成功・エラーを処理 reader. onprogress= updateProgress; reader. onload= loaded; reader. onerror= errorHandler; } function updateProgress( evt) { if ( evt. lengthComputable) { // evt.loadedとevt.totalはProgressEventプロパティ var loaded= ( evt. loaded/ evt. total); if ( loaded< 1 ) { // 進捗バーの長さを増加させる // style.width = (loaded * 200) + "px"; } } } function loaded( evt) { // 読み込んだファイルデータを取得 var fileString= evt. target. result; // UTF-16ファイルダンプを処理 if ( utils. regexp. isChinese( fileString)) { // 中国語文字 + 名前検証 } else { // 他の文字セットテストを実行 } // xhr.send(fileString) } function errorHandler( evt) { if ( evt. target. error. name== "NotReadableError" ) { // ファイルを読み取れませんでした } }
2. 用語とアルゴリズム
この仕様書で アルゴリズムを終了する
と記載されている場合、ユーザーエージェントは現在実行中のステップを完了した後にアルゴリズムを終了しなければなりません。
本仕様で定義される非同期 読み込みメソッドは、該当するアルゴリズムの終了前に戻る場合があり、
abort()
の呼び出しで終了することができます。
この仕様書のアルゴリズムとステップでは、以下の数学的演算を使用します:
-
max(a,b) は a と b のうち大きい方を返します。 実行は常に WebIDL [WebIDL] で定義される整数値で行われます。 例えば max(6,4) の結果は 6 です。 この演算は ECMAScript [ECMA-262] でも定義されています。
-
min(a,b) は a と b のうち小さい方を返します。 実行は常に WebIDL [WebIDL] で定義される整数値で行われます。 例えば min(6,4) の結果は 4 です。 この演算は ECMAScript [ECMA-262] でも定義されています。
-
<(より小さい)、≤(以下)、>(より大きい)などの数学的比較は ECMAScript [ECMA-262] と同様です。
Unix Epoch という用語は、
本仕様書では 1970年1月1日 00:00:00 UTC
(または 1970-01-01T00:00:00Z ISO 8601)を指します。
これは ECMA-262 [ECMA-262] で概念的に "0
" とされる時刻と同じです。
Blob
blob、start、end、contentType を受け取り、
次のステップを参照し、start パラメーターから end パラメーター(未満)までのバイトを含む新しい
Blob
を返します。動作は以下の通りです:
-
originalSize を blob の
size
とする。 -
start パラメーターが null でない場合は slice blob の開始点となる値であり、バイト順序位置として扱う。ゼロ番目の位置が最初のバイトを示す。ユーザーエージェントは以下の方法で start を正規化しなければならない:
- start が null の場合、relativeStart を 0 とする。
- start が負の場合、relativeStart を
max((originalSize + start), 0)
とする。 - それ以外の場合、relativeStart を
min(start, originalSize)
とする。
-
end パラメーターが null でない場合は slice blob の終了点となる値である。ユーザーエージェントは以下の方法で end を正規化しなければならない:
- end が null の場合、relativeEnd を originalSize とする。
- end が負の場合、relativeEnd を
max((originalSize + end), 0)
とする。 - それ以外の場合、relativeEnd を
min(end, originalSize)
とする。
-
contentType パラメーターが null でない場合は、
Blob
のメディア型を表すASCII小文字列として設定される。ユーザーエージェントは以下の方法で contentType を正規化しなければならない:- contentType が null の場合、relativeContentType を空文字列にする。
-
それ以外の場合、relativeContentType に contentType を設定し、次のサブステップを実行する:
-
relativeContentType に U+0020 から U+007E 以外の文字が含まれていたら、relativeContentType を空文字列にしてこれらのサブステップから戻る。
-
relativeContentType の全ての文字を ASCII小文字 に変換する。
-
-
span を
max((relativeEnd - relativeStart), 0)
とする。 -
以下の特徴を持つ新しい
Blob
オブジェクト S を返す:
3. Blobインターフェイスとバイナリデータ
Blob
オブジェクトはバイト列を参照し、
size
属性はバイト列全体のバイト数を示し、
type
属性は
バイト列のメディア型を表すASCII小文字列です。
各Blob
は内部にスナップショット状態を持ち、
その値は基盤となるストレージの状態に初期化されます(ストレージが存在する場合)。
スナップショット状態の詳細な規定はFile
に記載されています。
[Exposed =(Window ,Worker ),Serializable ]interface {
Blob (
constructor optional sequence <BlobPart >blobParts ,optional BlobPropertyBag = {});
options readonly attribute unsigned long long size ;readonly attribute DOMString type ; // Blobをバイト範囲のチャンクに分割Blob slice (optional [Clamp ]long long ,
start optional [Clamp ]long long ,
end optional DOMString ); // Blobから読み込む [
contentType NewObject ]ReadableStream stream (); [NewObject ]Promise <USVString >text (); [NewObject ]Promise <ArrayBuffer >arrayBuffer (); [NewObject ]Promise <Uint8Array >bytes (); };enum {
EndingType ,
"transparent" };
"native" dictionary {
BlobPropertyBag DOMString type = "";EndingType endings = "transparent"; };typedef (BufferSource or Blob or USVString );
BlobPart
Blob
オブジェクトはシリアライズ可能オブジェクトです。そのシリアライズ手順は、valueとserializedが与えられた場合、次の通りです:
-
serialized.[[SnapshotState]]にvalueのスナップショット状態を設定する。
-
serialized.[[ByteSequence]]にvalueの基盤となるバイト列を設定する。
そのデシリアライズ手順は、serializedとvalueが与えられた場合、次の通りです:
-
valueのスナップショット状態にserialized.[[SnapshotState]]を設定する。
-
valueの基盤となるバイト列にserialized.[[ByteSequence]]を設定する。
Blob
blobには関連するget streamアルゴリズムがあり、次のステップを実行します:
-
streamをblobの関連Realmで新しく作成されたReadableStreamとする。
-
バイト読み込み対応で streamをセットアップする。
-
以下のステップを並列で実行:
-
blobの全バイトが読み込まれるまで:
-
bytesをblobからチャンクを読み込むことで得られるバイト列とし、チャンクが読み込めない場合は失敗とする。
-
グローバルタスクをキューに入れる。blobの関連グローバルオブジェクトで、次のステップを実行:
-
chunkを新しい
Uint8Array
(ArrayBuffer
でbytesをラップ)とする。ArrayBuffer
の生成で例外が発生したら、その例外でstreamをエラーにし、これらのステップを中断する。 -
chunkをstreamにエンキューする。
Blobからの読み込みで実際に何が起こるか、どんなエラーが発生するか、チャンクサイズなどについてより具体的に規定する必要があります。
-
-
-
streamを返す。
3.1. コンストラクター
Blob()
コンストラクターは0個以上のパラメーターで呼び出せます。
Blob()
コンストラクターが呼び出されたとき、
ユーザーエージェントは以下のステップを実行しなければなりません:
3.1.1. コンストラクターパラメーター
Blob()
コンストラクターは以下のパラメーターで呼び出せます:
blobParts
sequence
-
以下の型の要素を任意の数・順序で受け取ります:
-
BufferSource
要素。 -
Blob
要素。 -
USVString
要素。
-
- 省略可能な
BlobPropertyBag
-
以下の省略可能なメンバーを受け取ります:
-
type
:Blob
のメディア型を表すASCII小文字列。このメンバーの規定は § 3.1 コンストラクター 参照。 -
endings
:"transparent"
または"native"
の値を取ることができるenum。デフォルト値は"transparent"
。"native"
に設定した場合、USVString
要素の改行がネイティブ形式に変換されます。
-
BlobPart
の sequence parts と BlobPropertyBag
options を受け取り、
以下のステップを実行します:
-
bytes を空のバイト列とする。
-
parts の各 element について:
-
element が
USVString
の場合、以下のサブステップを実行:-
s を element とする。
-
options の
endings
メンバーが"native"
なら、 s を ネイティブ形式に改行を変換した結果にする。 -
s を UTF-8 エンコードした結果を bytes に追加する。
注: WebIDL [WebIDL] のアルゴリズムは、無効なutf-16文字列の合致しないサロゲートをU+FFFD置換文字に置換します。
Blob
コンストラクターでデータ損失(文字化け等)が発生する場合があります。
-
-
element が
BufferSource
の場合、 バッファのバイトのコピーを取得し、それらのバイトを bytes に追加する。 -
element が
Blob
の場合、 そのバイト列を bytes に追加する。
-
-
bytes を返す。
-
native line ending を 符号位置 U+000A LF とする。
-
基盤となるプラットフォームの改行表現がキャリッジリターン+LFの場合、 native line ending を 符号位置 U+000D CR + 符号位置 U+000A LF に設定する。
-
result を空の文字列にする。
-
position を s の位置変数とし、初期値は s の先頭。
-
token を、position から s において U+000A LF または U+000D CR でない符号位置の並びを 収集した結果とする。
-
token を result に追加。
-
position が s の末尾を超えていない間:
-
position の 符号位置 が U+000D CR の場合:
-
native line ending を result に追加。
-
position を1進める。
-
position が末尾を超えておらず、position の 符号位置 が U+000A LF なら、さらに1進める。
-
-
それ以外で position の 符号位置 が U+000A LF なら、1進めて native line ending を result に追加。
-
token を、position から s において U+000A LF または U+000D CR でない符号位置を収集した結果とする。
-
token を result に追加。
-
-
result を返す。
// 新しいBlobオブジェクトを作成 var a= new Blob(); // 1024バイトのArrayBufferを作成 // bufferはFile読み込みで取得することも可能 var buffer= new ArrayBuffer( 1024 ); // bufferを元にArrayBufferViewオブジェクトを作成 var shorts= new Uint16Array( buffer, 512 , 128 ); var bytes= new Uint8Array( buffer, shorts. byteOffset+ shorts. byteLength); var b= new Blob([ "foobarbazetcetc" + "birdiebirdieboo" ], { type: "text/plain;charset=utf-8" }); var c= new Blob([ b, shorts]); var a= new Blob([ b, c, bytes]); var d= new Blob([ buffer, b, c, bytes]);
3.2. 属性
size
, 型 unsigned long long, 読み取り専用- byte
列のバイト数を返します。
取得時、準拠するユーザーエージェントは
FileReader
やFileReaderSync
オブジェクトで読み取れるバイト総数を返すか、Blob
に読み取り可能なバイトがない場合は 0 を返します。 type
, 型 DOMString, 読み取り専用-
Blob
のメディア型を表すASCII小文字列です。 取得時、ユーザーエージェントはBlob
の型をASCII小文字列として返し、 これをbyte 列に変換した場合、 解析可能な MIME 型となるか、 型が判別できない場合は空文字列(0バイト)を返します。type
属性はウェブアプリケーション自身がコンストラクター呼び出しやslice()
呼び出しで設定できます。 これらの場合の規定は § 3.1 コンストラクター、§ 4.1 コンストラクター、 § 3.3.1 slice() メソッド を参照してください。 また、ユーザーエージェントがtype
を決定することもあり、 特にbyte 列がディスク上のファイル由来の場合は ファイル型ガイドラインに従って規定します。注:
Blob
の型 t は、 解析可能な MIME 型とみなされ、 Blob オブジェクトの型を表すASCII文字列をバイト列に変換して MIME 型の解析アルゴリズムを実行して失敗しなければ成立します。注:
type
属性の利用はパッケージデータアルゴリズムに通知され、 fetchでblob URLを取得する際のContent-Type
ヘッダーが決定されます。
3.3. メソッドとパラメーター
3.3.1. slice()
メソッド
slice()
メソッドは
オプションの start パラメーターから
オプションの end パラメーター(未満)までのバイトと、
オプションの contentType パラメーターを値とする type
属性を持つ
新しい Blob
オブジェクトを返します。動作は次の通りです:
-
sliceStart、sliceEnd、sliceContentType を null にする。
-
start が与えられた場合、sliceStart に start を設定。
-
end が与えられた場合、sliceEnd に end を設定。
-
contentType が与えられた場合、sliceContentType に contentType を設定。
-
slice blob の結果を this, sliceStart, sliceEnd, sliceContentType で返す。
slice()
呼び出し例です。File
インターフェイスは Blob
インターフェイスを継承しているため、例は File
インターフェイスの利用です。
// DOMからinput要素を取得 var file= document. getElementById( 'file' ). files[ 0 ]; if ( file) { // fileの完全なコピーを作る // 下記2つの呼び出しは同じ意味 var fileClone= file. slice(); var fileClone2= file. slice( 0 , file. size); // ファイルの中間から1/2チャンク分切り出す(負数利用) var fileChunkFromEnd= file. slice( - ( Math. round( file. size/ 2 ))); // ファイル先頭から1/2チャンク分切り出す var fileChunkFromStart= file. slice( 0 , Math. round( file. size/ 2 )); // ファイル先頭から末尾150バイト手前まで切り出す var fileNoMetadata= file. slice( 0 , - 150 , "application/experimental" ); }
3.3.2. stream()
メソッド
stream()
メソッドは呼び出されると、
get stream を this
に対して呼び出した結果を返さなければなりません。
3.3.3. text()
メソッド
text()
メソッドは呼び出されると、以下のステップを実行します:
-
get stream を this に対して呼び出した結果の stream を取得する。
-
reader を reader取得で stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。
-
promise を 全バイト読み出しで stream と reader で取得する。
-
promise の fulfill時にその最初の引数へ UTF-8デコード を実行した結果を返す。
注: この動作は readAsText()
とは異なり、
Fetchのtext()
とより一致するよう調整されています。
このメソッドは必ずUTF-8を使用しますが、FileReader
はblobのtypeや渡されたencoding名によって異なるエンコーディングを利用できます。
3.3.4.
arrayBuffer()
メソッド
arrayBuffer()
メソッドは呼び出されると、以下のステップを実行します:
-
get stream を this に対して呼び出した結果の stream を取得する。
-
reader を reader取得で stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。
-
promise を 全バイト読み出しで stream と reader で取得する。
-
promise の fulfill時にその最初の引数を内容とする新しい
ArrayBuffer
を返す。
3.3.5. bytes()
メソッド
bytes()
メソッドは呼び出されると、以下のステップを実行します:
-
get stream を this に対して呼び出した結果の stream を取得する。
-
reader を reader取得で stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。
-
promise を 全バイト読み出しで stream と reader で取得する。
-
promise の fulfill時にその最初の引数を内容とする新しい
Uint8Array
(ArrayBuffer
でラップ)を返す。
4. Fileインターフェイス
File
オブジェクトは
Blob
オブジェクトであり、
name
属性(文字列)を持ちます。
ウェブアプリケーション内でコンストラクターにより作成するか、
または基盤の(OS)ファイルシステムのファイル由来のバイト列への参照となります。
File
オブジェクトがディスク上のファイル由来のバイト列参照の場合、
スナップショット状態は
File
オブジェクト作成時の
ディスク上のファイルの状態に設定すべきです。
注: これはユーザーエージェント実装にとって容易ではなく、
must ではなく should としています [RFC2119]。
ユーザーエージェントは File
オブジェクトの スナップショット状態を
参照取得時のディスクの状態に設定するよう努めるべきです。
参照取得後にディスク上のファイルが変更された場合、
File
の スナップショット状態は
基盤ストレージの状態と異なるものとなります。
ユーザーエージェントは更新日時や他の仕組みを用いて スナップショット状態を管理してもよいですが、これは実装詳細です。
File
オブジェクトがディスク上のファイル参照の場合、
ユーザーエージェントはそのファイルの type
を返し、
以下のファイル型ガイドラインに従わなければなりません:
-
ユーザーエージェントは
type
を ASCII小文字列として返し、そのバイト列が 解析可能なMIME型となるようにするか、 型が判定できない場合は空文字列(0バイト)を返す。 -
ファイル型が
text/plain
の場合、ユーザーエージェントはメディア型のパラメータ辞書部分に charsetパラメータを追加してはなりません [MIMESNIFF]。 -
ユーザーエージェントはエンコーディングの推定(統計的手法など)を行ってはなりません。
[Exposed =(Window ,Worker ),Serializable ]interface :
File Blob {(
constructor sequence <BlobPart >fileBits ,USVString fileName ,optional FilePropertyBag = {});
options readonly attribute DOMString name ;readonly attribute long long lastModified ; };dictionary :
FilePropertyBag BlobPropertyBag {long long lastModified ; };
File
オブジェクトは
シリアライズ可能オブジェクトです。そのシリアライズ手順は value と serialized が与えられた場合:
-
serialized.[[SnapshotState]] に value の スナップショット状態を設定する。
-
serialized.[[ByteSequence]] に value の基盤となるバイト列を設定する。
-
serialized.[[Name]] に value の
name
属性の値を設定する。 -
serialized.[[LastModified]] に value の
lastModified
属性の値を設定する。
デシリアライズ手順は、value と serialized が与えられた場合:
-
value の スナップショット状態に serialized.[[SnapshotState]] を設定する。
-
value の基盤となるバイト列に serialized.[[ByteSequence]] を設定する。
-
value の
name
属性の値を serialized.[[Name]] で初期化する。 -
value の
lastModified
属性の値を serialized.[[LastModified]] で初期化する。
4.1. コンストラクター
File
コンストラクターは2つまたは3つのパラメーター(辞書型は省略可)で呼び出します。
File()
コンストラクターが呼び出されたとき、
ユーザーエージェントは以下のステップを実行します:
-
bytes を blob 部分の処理で
fileBits
とoptions
を用いて得る。 -
n をコンストラクター引数
fileName
とする。注: OSファイルシステムはファイル名表現が異なります。 構築されたファイルではUTF-16を必須にすることでファイル名のバイト列変換時の曖昧さを減らします。
-
FilePropertyBag
辞書引数を次のサブステップで処理:-
type
メンバーが空文字列でない場合、 t をtype
辞書メンバー値に設定。 t にU+0020~U+007E以外の文字が含まれていれば t を空文字列にしてサブステップから戻る。 -
t の全ての文字をASCII小文字に変換。
-
lastModified
メンバーが指定されていれば d をlastModified
辞書メンバー値に設定。 指定されていない場合は、現在日時(Unix Epochからのミリ秒数。Date.now()
[ECMA-262]と同等)に設定。注: ECMA-262
Date
オブジェクトはUnix Epochからのミリ秒数のlong long
値に変換されるため、lastModified
メンバーはDate
オブジェクトでもよい [ECMA-262]。
-
-
新しい
File
オブジェクト F を返す。条件:-
F は bytes バイト列を参照。
-
F.
size
に bytes のバイト総数を設定。 -
F.
name
に n を設定。 -
F.
type
に t を設定。 -
F.
lastModified
に d を設定。
-
4.1.1. コンストラクターパラメーター
File()
コンストラクターは以下のパラメーターで呼び出せます:
fileBits
sequence
-
以下の要素を任意の数・順序で受け取ります:
-
BufferSource
要素。 -
USVString
要素。
-
fileName
パラメーターUSVString
型でファイル名を表します。規定は § 4.1 コンストラクター を参照してください。- 省略可能な
FilePropertyBag
辞書 -
BlobPropertyBag のメンバーに加え、以下のメンバーを持ちます:
-
省略可能な
lastModified
メンバー(long long
型)。規定は § 4.1 コンストラクター 参照。
-
4.2. 属性
name
, 型 DOMString, 読み取り専用- ファイルの名前。
取得時はファイル名(文字列)を返します。
OSファイルシステムごとに様々なファイル名表現や規約がありますが、ここではパス情報を含まない単なる名前です。
取得時に情報が取得できない場合は空文字列を返します。
File
オブジェクトがコンストラクターで生成された場合、詳細な規定は § 4.1 コンストラクター にあります。 lastModified
, 型 long long, 読み取り専用- ファイルの最終更新日時。
取得時、ユーザーエージェントがこの情報を取得できる場合は、ファイルの最終更新時刻(Unix Epochからのミリ秒数)を
long long
型で返します。 更新日時が不明な場合は、現在日時(Unix Epochからのミリ秒数)をlong long
型で返します。これはDate
[ECMA-262] と同等です。. now() File
オブジェクトがコンストラクターで生成された場合、詳細な規定は § 4.1 コンストラクター にあります。
File
インターフェイスは FileList
型属性を公開するオブジェクトで利用できます(HTML [HTML]
で定義)。
File
インターフェイスは
Blob
を継承し、不変(immutable)です。そのため、読み込み操作開始時にメモリ上に読み込まれるファイルデータを表します。
ユーザーエージェントは、読み込み時点でファイルが存在しない場合は エラーとして処理し、
Web Worker [Workers] で FileReaderSync
を使った場合は NotFoundError
例外を投げ、
error
イベントを発火する場合は error
属性で NotFoundError
を返します。
var file= document. getElementById( "filePicker" ). files[ 0 ]; var date= new Date( file. lastModified); println( "ファイル「" + file. name+ "」は " + date. toDateString() + " に更新されました。" ); ... // 特定の最終更新日時でファイルを生成 var d= new Date( 2013 , 12 , 5 , 16 , 23 , 45 , 600 ); var generatedFile= new File([ "Rough Draft ...." ], "Draft1.txt" , { type: "text/plain" , lastModified: d}) ...
5. FileListインターフェイス
注: FileList
インターフェイスは「リスクあり」とみなされるべきです。
現行標準の動向として、このようなインターフェイスはECMAScript Array
プラットフォームオブジェクトに置き換えられる傾向があります
[ECMA-262]。
特に、filelist
のような構文はリスクがありますが、
他のほとんどの FileList
のプログラム的利用は、
最終的に Array
型へ移行しても影響を受ける可能性は低いです。
このインターフェイスは File
オブジェクトのリストです。
[Exposed =(Window ,Worker ),Serializable ]interface {
FileList getter File ?item (unsigned long index );readonly attribute unsigned long length ; };
FileList
オブジェクトはシリアライズ可能オブジェクトです。そのシリアライズ手順は value と serialized が与えられた場合:
デシリアライズ手順は serialized と value が与えられた場合:
<input type="file">
要素にDOMアクセスし、選択されたファイルを取得します。
// uploadData は form要素 // fileChooser は 'file' 型の input要素 var file= document. forms[ 'uploadData' ][ 'fileChooser' ]. files[ 0 ]; // 別構文 // var file = document.forms['uploadData']['fileChooser'].files.item(0); if ( file) { // ファイル操作を実施 }
5.1. 属性
length
, 型 unsigned long, 読み取り専用FileList
オブジェクト内のファイル数を返すこと。 ファイルがない場合は0を返すこと。
5.2. メソッドとパラメーター
item(index)
-
FileList
内のindex番目のFile
オブジェクトを返すこと。FileList
内にindex番目のFile
オブジェクトがない場合、このメソッドはnull
を返すこと。index
は、ユーザーエージェントによってFileList
内のFile
オブジェクトの位置を示す値として扱われる。 0が最初のファイルを示す。サポートされるプロパティインデックスは、0からFileList
オブジェクトが表すFile
オブジェクト数-1までの数字。 ファイルオブジェクトがない場合は、サポートされるプロパティインデックスも存在しない。
注: HTMLInputElement
インターフェイスは FileList
型の読み取り専用属性を持っており、上記例でアクセスされています。
FileList
型の読み取り専用属性を持つ他のインターフェイスには、
DataTransfer
インターフェイスなどがあります。
6. データの読み込み
6.1. ファイル読み込みタスクソース
本仕様は新しい汎用 タスクソースである ファイル読み込みタスクソース を定義します。
これは本仕様でキューされるすべての タスクで、
Blob
や File
オブジェクトに関連付けられたバイト列を読み取るために利用されます。
バイナリデータの非同期読み取りに反応して発火する機能に使用されます。
6.2. FileReader
API
[Exposed =(Window ,Worker )]interface :
FileReader EventTarget {constructor (); // 非同期読み取りメソッドundefined readAsArrayBuffer (Blob );
blob undefined readAsBinaryString (Blob );
blob undefined readAsText (Blob ,
blob optional DOMString );
encoding undefined readAsDataURL (Blob );
blob undefined abort (); // 状態const unsigned short = 0;
EMPTY const unsigned short = 1;
LOADING const unsigned short = 2;
DONE readonly attribute unsigned short readyState ; // FileまたはBlobデータreadonly attribute (DOMString or ArrayBuffer )?result ;readonly attribute DOMException ?error ; // イベントハンドラー属性attribute EventHandler onloadstart ;attribute EventHandler onprogress ;attribute EventHandler onload ;attribute EventHandler onabort ;attribute EventHandler onerror ;attribute EventHandler onloadend ; };
FileReader
には 状態("empty"
、"loading"
、"done"
)があり、初期値は
"empty"
です。
FileReader
には 結果(null
、DOMString
、ArrayBuffer
)があり、初期値は
null
です。
FileReader
には エラー(null
または DOMException
)があり、初期値は
null
です。
FileReader()
コンストラクターは呼び出されると新しい FileReader
オブジェクトを返します。
readyState
属性のgetterは、
thisの状態ごとに次のステップを実行します:
result
属性のgetterは、
thisの結果を返します。
error
属性のgetterは、
thisのエラーを返します。
FileReader
fr には 読み込み操作アルゴリズムがあり、
blob、type、オプションのencodingNameを受け取り、以下のステップを実行します:
-
frの状態が
"loading"
の場合、InvalidStateError
DOMException
を投げる。 -
frの状態を
"loading"
に設定。 -
frの結果を
null
に設定。 -
frのエラーを
null
に設定。 -
streamをblobに対してget streamで取得。
-
readerをstreamからreader取得で取得。
-
bytesを空のバイト列とする。
-
chunkPromiseをstreamとreaderでチャンク読み出しの結果とする。
-
isFirstChunkをtrueに設定。
-
並列で、trueの間:
-
chunkPromiseのfulfilledまたはrejectedを待つ。
-
chunkPromiseがfulfilledかつisFirstChunkがtrueの場合、タスクをキューし、
loadstart
進捗イベントをfrに発火。loadstart
の同期発火に変更する可能性あり。XMLHttpRequestの挙動に合わせるため。[Issue #119] -
isFirstChunkをfalseに設定。
-
chunkPromiseがfulfilledかつ
done
がfalseでvalue
がUint8Array
の場合: -
それ以外でchunkPromiseがfulfilledかつ
done
がtrueの場合、タスクをキューし、次のステップを実行しこのアルゴリズムを終了: -
それ以外でchunkPromiseがerrorでrejectedされた場合、タスクをキューし、次のステップを実行しこのアルゴリズムを終了:
-
これらすべてのタスクでファイル読み込みタスクソースを利用すること。
6.2.1. イベントハンドラー内容属性
以下は イベントハンドラー内容属性(および対応する イベントハンドラーイベント型)であり、
ユーザーエージェントは FileReader
上でDOM属性としてサポートしなければなりません:
イベントハンドラー内容属性 | イベントハンドラーイベント型 |
---|---|
onloadstart
| loadstart
|
onprogress
| progress
|
onabort
| abort
|
onerror
| error
|
onload
| load
|
onloadend
| loadend
|
6.2.2. FileReaderの状態
FileReader
オブジェクトは3つの状態のいずれかになります。
readyState
属性でオブジェクトの状態を確認できます:
EMPTY
(数値値 0)-
FileReader
オブジェクトが生成されていて、保留中の読み込みはありません。 読み込みメソッドは呼び出されていません。 これは新規作成されたFileReader
オブジェクトのデフォルト状態であり、 いずれかの 読み込みメソッドが呼ばれるまで継続します。 LOADING
(数値値 1)-
File
またはBlob
を読み込んでいる状態です。 読み込みメソッドのいずれかが処理中であり、 読み込み中にエラーは発生していません。 DONE
(数値値 2)-
ファイル全体
File
またはBlob
がメモリに読み込まれた状態、 または ファイル読み込みエラーが発生した状態、 またはabort()
で読み込みが中断された状態です。FileReader
はFile
やBlob
をもう読み込んでいません。readyState
がDONE
に設定されている場合は、このFileReader
で少なくとも1回は 読み込みメソッドが呼び出されています。
6.2.3. ファイルやBlobの読み込み
FileReader
インターフェイスは複数の 非同期読み取りメソッド—readAsArrayBuffer()
,
readAsBinaryString()
,
readAsText()
および readAsDataURL()
を提供し、ファイルをメモリに読み込みます。
注: 同じ FileReader
オブジェクトで複数の読み込みメソッドを同時に呼び出した場合、
ユーザーエージェントは InvalidStateError
を、readyState
= LOADING
状態のときに呼ばれた読み込みメソッドに対して投げます。
(FileReaderSync
は複数の 同期読み取りメソッドを提供します。
FileReader
および FileReaderSync
の同期・非同期読み取りメソッドを総称して 読み込みメソッドと呼びます。)
6.2.3.1. readAsDataURL()
メソッド
readAsDataURL(blob)
メソッドは呼び出されると、
blob に対して DataURL で 読み込み操作を開始しなければなりません。
6.2.3.2. readAsText()
メソッド
readAsText(blob, encoding)
メソッドは呼び出されると、
blob に対して Text と encoding で 読み込み操作を開始しなければなりません。
6.2.3.3.
readAsArrayBuffer()
readAsArrayBuffer(blob)
メソッドは呼び出されると、
blob に対して ArrayBuffer で 読み込み操作を開始しなければなりません。
6.2.3.4.
readAsBinaryString()
メソッド
readAsBinaryString(blob)
メソッドは呼び出されると、
blob に対して BinaryString で 読み込み操作を開始しなければなりません。
注: readAsArrayBuffer()
の利用が readAsBinaryString()
より推奨されます。
readAsBinaryString()
は後方互換のために提供されています。
6.2.3.5. abort()
メソッド
abort()
メソッドが呼ばれると、
ユーザーエージェントは以下のステップを実行しなければなりません:
-
this の 状態が
"empty"
または this の 状態が"done"
の場合、 this の 結果 をnull
に設定し、このアルゴリズムを終了する。 -
this の 状態が
"loading"
の場合、 this の 状態 を"done"
に設定し、this の 結果 をnull
に設定する。 -
もし タスク が this 由来で ファイル読み込みタスクソース の関連付けられた タスクキュー に存在する場合、 それらの タスク をそのタスクキューから削除する。
6.3. データのパッケージ化
Blob
は
パッケージデータアルゴリズムを持ちます。
bytes、type、オプションのmimeType、オプションのencodingNameを受け取り、
typeごとに以下のステップを実行します:
- DataURL
-
bytes を DataURL [RFC2397] として返す。ただし以下の考慮事項に従う:
-
Data URL の一部として mimeType が利用可能な場合は使用し、 Data URL仕様 [RFC2397] に従う。
-
mimeType が利用できない場合は、メディアタイプなしの Data URL を返す [RFC2397]。
DataURL の生成仕様をより明確に規定する必要あり。[Issue #104]
-
- Text
-
-
encoding を失敗にする。
-
encodingName が存在すれば、encoding を encoding取得で encodingName から得る。
-
encoding が失敗で mimeType が存在する場合:
-
type を MIME型解析で mimeType から得る。
-
type が失敗でなければ、 encoding を encoding取得で type の parameters[
"charset"
] から得る。blob
のtype
属性がtext/plain;charset=utf-8
なら、encoding取得 を"utf-8"
ラベルで実行する。 ユーザーエージェントは Charsetパラメータのうち encodingのラベル部分のみ抽出・解析しなければならない。
-
-
encoding が失敗なら encoding を UTF-8 に設定。
-
フォールバック encoding で デコードし、bytes を返す。
-
- ArrayBuffer
-
bytes を内容とする新しい
ArrayBuffer
を返す。 - BinaryString
-
bytes をバイナリ文字列として返す。各バイトは [0..255] の値を持つコード単位として表現される。
6.4. イベント
FileReader
オブジェクトは本仕様におけるすべてのイベントのイベントターゲットでなければなりません。
本仕様において 進捗イベントを発火する(ある ProgressEvent
e
を、指定した FileReader
reader
に対して発火する)と言った場合、以下が規定事項です:
-
進捗イベント
e
はバブルしません。e.bubbles
は false でなければなりません [DOM] -
進捗イベント
e
はキャンセル不可です。e.cancelable
は false でなければなりません [DOM]
6.4.1. イベント一覧
以下は 発火される
FileReader
オブジェクト上のイベントです。
イベント名 | インターフェイス | 発火タイミング |
---|---|---|
loadstart
| ProgressEvent
| 読み込みが開始されたとき |
progress
| ProgressEvent
| blob の読み込み(およびデコード)中
|
abort
| ProgressEvent
| 読み込みが中断されたとき。
例えば abort()
メソッドの呼び出しによる場合など。
|
error
| ProgressEvent
| 読み込みが失敗したとき(ファイル読み込みエラー参照)。 |
load
| ProgressEvent
| 読み込みが正常に完了したとき |
loadend
| ProgressEvent
| リクエストが完了したとき(成功・失敗を問わず) |
6.4.2. イベント不変条件まとめ
この節は参考情報です。
本仕様の非同期 読み込みメソッド に関する イベント発火の不変条件は以下の通りです:
-
loadstart
が発火したら、対応するloadend
が読み込み完了時に発火します。ただし以下の場合は除く:注:
loadstart
とloadend
は1対1で対応するものではありません。この例は「リードチェイン」を示します。イベントハンドラ内で別の読み込みを開始し、最初の読み込みが継続する場合です。// 以下のようなコード… reader. readAsText( file); reader. onload= function (){ reader. readAsText( alternateFile);} ..... //... 最初の読み込みでは loadend イベントは発火しない reader. readAsText( file); reader. abort(); reader. onabort= function (){ reader. readAsText( updatedFile);} //... 最初の読み込みでは loadend イベントは発火しない -
progress
イベントはblob
がメモリに完全に読み込まれたときに1回発火します。 -
progress
イベントはabort
、load
、error
のいずれかが発火した後には発火しません。 1つの読み込みについてはabort
、load
、error
のいずれか1つだけが発火します。
6.5. スレッドでの読み込み
Web Workersでは、同期的な File
や Blob
の読み込みAPIが利用可能です。スレッド上の読み込みはメインスレッドをブロックしないためです。
この節ではWorkers内で利用できる同期APIを定義します。Workerは非同期API(FileReader
オブジェクト)および同期API(FileReaderSync
オブジェクト)を利用できます。
6.5.1. FileReaderSync
API
このインターフェイスは同期的に読み込みを行い、
File
や Blob
オブジェクトをメモリに読み込みます。
[Exposed =(DedicatedWorker ,SharedWorker )]interface {
FileReaderSync (); // 同期的に文字列を返す
constructor ArrayBuffer readAsArrayBuffer (Blob );
blob DOMString readAsBinaryString (Blob );
blob DOMString readAsText (Blob ,
blob optional DOMString );
encoding DOMString readAsDataURL (Blob ); };
blob
6.5.1.1. コンストラクター
FileReaderSync()
コンストラクターが呼び出されると、ユーザーエージェントは新しい FileReaderSync
オブジェクトを返さなければなりません。
6.5.1.2. readAsText()
readAsText(blob, encoding)
メソッドは呼び出されると、以下のステップを実行しなければなりません:
-
stream を blob に対して get stream で取得する。
-
reader を stream から reader取得 で取得する。
-
promise を stream と reader で 全バイトの読み出し結果とする。
-
promise がfulfilledまたはrejectedになるまで待つ。
-
promise が バイト列 bytes でfulfilledされた場合:
-
promise の rejection理由をthrowする。
6.5.1.3.
readAsDataURL()
メソッド
readAsDataURL(blob)
メソッドは呼び出されると、以下のステップを実行しなければなりません:
-
stream を blob に対して get stream で取得する。
-
reader を stream から reader取得 で取得する。
-
promise を stream と reader で 全バイトの読み出し結果とする。
-
promise がfulfilledまたはrejectedになるまで待つ。
-
promise が バイト列 bytes でfulfilledされた場合:
-
promise の rejection理由をthrowする。
6.5.1.4.
readAsArrayBuffer()
メソッド
readAsArrayBuffer(blob)
メソッドは呼び出されると、以下のステップを実行しなければなりません:
-
stream を blob に対して get stream で取得する。
-
reader を stream から reader取得 で取得する。
-
promise を stream と reader で 全バイトの読み出し結果とする。
-
promise がfulfilledまたはrejectedになるまで待つ。
-
promise が バイト列 bytes でfulfilledされた場合:
-
promise の rejection理由をthrowする。
6.5.1.5.
readAsBinaryString()
メソッド
readAsBinaryString(blob)
メソッドは呼び出されると、以下のステップを実行しなければなりません:
-
stream を blob に対して get stream で取得する。
-
reader を stream から reader取得 で取得する。
-
promise を stream と reader で 全バイトの読み出し結果とする。
-
promise がfulfilledまたはrejectedになるまで待つ。
-
promise が バイト列 bytes でfulfilledされた場合:
-
promise の rejection理由をthrowする。
注: readAsArrayBuffer()
の利用が readAsBinaryString()
より推奨されます。
readAsBinaryString()
は後方互換のために提供されています。
7. エラーと例外
ファイル読み込みエラーは、基盤となるファイルシステムからファイルを読み込む際に発生する場合があります。 以下に示す潜在的エラー条件のリストは参考情報です。
-
アクセスしようとしている
File
やBlob
が、非同期読み込みメソッドまたは同期読み込みメソッドの呼び出し時に存在しない場合があります。 これは、参照の取得後に移動または削除されたため(例:他のアプリケーションによる並行変更)が考えられます。NotFoundError
を参照してください。 -
File
やBlob
が読み込めない場合があります。 これは、File
やBlob
への参照取得後に発生するパーミッションの問題(例:他のアプリケーションによる並行ロック)が理由の場合があります。 また、スナップショット状態が変更された場合も含まれます。NotReadableError
を参照してください。 -
ユーザーエージェントは、Webアプリケーションで使用するには一部ファイルが安全でないと判断する場合があります。 ファイルは、元の選択後にディスク上で変更される可能性があり、無効な読み取りとなる場合があります。 さらに、一部のファイルやディレクトリ構造は基盤ファイルシステムによって制限されている場合があり、 それらからの読み込みはセキュリティ違反とみなされる場合があります。 § 9 セキュリティとプライバシーの考慮事項および
SecurityError
を参照してください。
7.1. 例外のスローまたはエラーの返却
この節は規定事項です。
File
や Blob
の読み込み時にはエラー条件が発生する場合があります。
読み込み操作は、File
や Blob
の読み込み時のエラー条件によって終了する場合があります。
特定のエラー条件が get stream
アルゴリズムの失敗を引き起こす場合、その条件は 失敗理由 と呼ばれます。失敗理由 には、NotFound、UnsafeFile、TooManyReads、SnapshotState、FileLock のいずれかがあります。
同期読み込みメソッドは、下記表に記載された型の例外をthrowします。これは特定の失敗理由によるエラーが発生した場合です。
非同期読み込みメソッドは、error
属性(FileReader
オブジェクト)を使用し、
特定の失敗理由によるエラーが発生した場合は、下記表で最も適切な型の DOMException
オブジェクトを返し、
それ以外の場合は null を返します。
型 | 説明および失敗理由 |
---|---|
NotFoundError
|
File
または Blob
リソースが読み込み時に見つからない場合、
これは NotFound 失敗理由です。
非同期読み込みメソッドの場合、 |
SecurityError
|
以下の場合:
非同期読み込みメソッドの場合、 他の失敗理由でカバーされていない状況で発生するセキュリティエラーです。 |
NotReadableError
|
以下の場合:
非同期読み込みメソッドの場合、 |
8. BlobおよびMediaSource参照用のURL
この節では、Blob
および
MediaSource
オブジェクトを参照するためのスキーム付きURLを定義します。
8.1. 概要
この節は参考情報です。
Blob(またはオブジェクト)URLは
blob:http://example.com/550e8400-e29b-41d4-a716-446655440000
などのURLです。
これにより、Blob
や
MediaSource
を
URLのみ対応のAPI(例:img
要素)と統合できます。Blob
URLはローカル生成データのナビゲートやダウンロードのトリガーにも利用できます。
この目的のため URL
インターフェイスに2つの静的メソッド createObjectURL(obj)
と revokeObjectURL(url)
が公開されています。
最初のメソッドは URL と Blob
のマッピングを作成し、
2番目のメソッドはそのマッピングを破棄します。
マッピングが存在する間は Blob
はガベージコレクトされませんので、
参照が不要になったら早めにURLを破棄する必要があります。
URLを生成したグローバルが消滅すると全てのURLも破棄されます。
8.2. モデル
各ユーザーエージェントは blob URLストア を保持しなければなりません。 blob URLストアは マップであり、 キーは 有効なURL文字列、 値は blob URLエントリです。
blob URLエントリは
オブジェクト
(型は Blob
または
MediaSource
)と、
環境
(環境設定オブジェクト)で構成されます。
注: 仕様書は blobオブジェクト取得アルゴリズムを使って blob URLエントリ の オブジェクトにアクセスしなければなりません。
blob URLストアのキー(blob URLとも呼ばれる)は、
有効なURL文字列であり、
パースすると
URLとなり、
スキームが "blob
"、
空のホスト、
パスは1要素で、その要素も有効なURL文字列です。
navigation
"
environment が与えられた場合、以下の手順を実行します。返り値は オブジェクトです。
-
isAuthorized を true にする。
-
environment が文字列 "
navigation
" でなければ、 isAuthorized を 同じパーティションでのblob URL利用確認の結果にする。 -
isAuthorized が false なら、失敗を返す。
-
blobUrlEntry の オブジェクトを返す。
-
result を空文字列にする。
-
文字列 "
blob:
" を result に追加する。 -
settings を 現在の設定オブジェクトとする。
-
origin を settings の オリジンとする。
-
serialized を origin の ASCIIシリアライズ結果とする。
-
serialized が "
null
" なら、実装定義の値に設定する。 -
serialized を result に追加する。
-
U+0024 SOLIDUS (
/
) を result に追加する。 -
UUID [RFC4122] を文字列として生成し、result に追加する。
-
result を返す。
-
store をユーザーエージェントの blob URLストアとする。
-
url を 新しいblob URL生成の結果とする。
-
entry を object および 現在の設定オブジェクトからなる新しいblob URLエントリとする。
-
store[url] = entry を設定する。
-
url を返す。
-
store をユーザーエージェントの blob URLストアとする;
-
url string を urlのシリアライズ結果とする。
8.3. blob URLのデリファレンスモデル
-
store をユーザーエージェントの blob URLストアとする。
-
url string を urlのシリアライズ(フラグメント除外フラグをセット)結果とする。
-
もし store[url string] が 存在すれば store[url string] を返し、そうでなければ失敗を返す。
blob URLのパース・フェッチモデルに関する追加要件は [URL] および [Fetch] の現行標準に定義されています。
8.3.1. blob URLのオリジン
この節は参考情報です。
blob URLのオリジンは、URLがまだ失効されていない限り、そのURLを作成した環境のオリジンと常に同じです。これは [URL] 現行標準がURLのパース時に blob URLストアを参照し、そのエントリを使って 正しいオリジンを返すことで実現されています。
URLが失効されている場合でも、オリジンのシリアライズはblob URLを作成した環境のオリジンのシリアライズと同じままです。 ただし不透明なオリジンの場合は、オリジン自体が異なる場合もあります。しかしこの違いは観測できません。なぜなら失効されたblob URLはもはや解決・フェッチできないためです。
8.3.2. blob URLへのアクセス制限
blob URLは、ストレージキーが blob URLが作成された環境と一致する環境からのみフェッチ可能です。blob URLのナビゲーションにはこの制限はありません。
-
blobStorageKey を 非ストレージ用途のストレージキー取得で blobUrlEntry の 環境を渡して得る。
-
environmentStorageKey を 非ストレージ用途のストレージキー取得で environmentを渡して得る。
-
blobStorageKey が equal で environmentStorageKey でないなら false を返す。
-
true を返す。
8.3.3. blob URLのライフタイム
この仕様は ドキュメントアンロード時のクリーンアップ手順を以下の手順で拡張します:
-
environment を
Document
の 関連設定オブジェクトとする。 -
store をユーザーエージェントの blob URLストアとする。
8.4. blob URLの生成と破棄
Blob URLはURL
オブジェクト上の静的メソッドで生成・破棄されます。
blob URLの破棄は
blob URLと参照されるリソースの関連付けを解除し、
破棄後にデリファレンスされた場合、ユーザーエージェントはネットワークエラーが発生したかのように動作しなければなりません。
この節ではURL仕様への補足インターフェイスを記述し、blob
URLの生成と破棄のためのメソッドを示します。
[Exposed =(Window ,DedicatedWorker ,SharedWorker )]partial interface URL {static DOMString createObjectURL ((Blob or MediaSource ));
obj static undefined revokeObjectURL (DOMString ); };
url
createObjectURL(obj)
静的メソッドは
objのblob
URLストアへのエントリ追加結果を返さなければなりません。
revokeObjectURL(url)
静的メソッドは以下の手順を実行しなければなりません:
-
urlRecord を urlのパース結果とする。
-
urlRecordのスキームが"
blob
"でなければreturn。 -
entry を urlRecord の blob URLエントリとする。
-
entryがnullならreturn。
-
isAuthorized を 同じパーティションでのblob URL利用確認に entryと現在の設定オブジェクトを渡した結果とする。
-
isAuthorizedがfalseならreturn。
-
blob URLストアからエントリ削除をurlに対して実行する。
注: 登録されていないURLや他のストレージパーティションの環境から登録されたURLの破棄を試みても、エラーは投げずに黙って失敗します。 この場合、ユーザーエージェントがエラーコンソールにメッセージを表示することがあります。
注: 破棄後にurlをデリファレンスしようとすると ネットワークエラーになります。 破棄前に開始されたリクエストは成功すべきです。
window1
とwindow2
は別ですが、
同一オリジンです。window2
は
iframe
としてwindow1
内に存在し得ます。
myurl= window1. URL. createObjectURL( myblob); window2. URL. revokeObjectURL( myurl);
ユーザーエージェントはグローバルなblob
URLストアを持つため、
生成元とは異なるwindowからオブジェクトURLを破棄することが可能です。
URL.
の呼び出しにより、以降のrevokeObjectURL()
myurl
デリファレンスは
ネットワークエラー発生扱いとなります。
8.4.1. blob URL生成と破棄の例
Blob URLは
fetchでBlob
オブジェクトを取得するための文字列であり、
document
が存続する限り
URL.
で生成したURLは有効です。
§ 8.3.3 blob URLのライフタイム参照。
createObjectURL()
この節ではblob URLの生成・破棄の使用例を説明します。
img
要素
[HTML]が同じblob URLを参照しています:
url= URL. createObjectURL( blob); img1. src= url; img2. src= url;
URL.revokeObjectURL()
を明示的に呼び出しています。
var blobURLref= URL. createObjectURL( file); img1= new Image(); img2= new Image(); // 両方の代入は正常に動作します img1. src= blobURLref; img2. src= blobURLref; // ... bodyロード後 // 両画像の読み込みが完了しているか確認 if ( img1. complete&& img2. complete) { // 以降の参照で例外が投げられるようにする URL. revokeObjectURL( blobURLref); } else { msg( "Images cannot be previewed!" ); // 文字列参照を破棄 URL. revokeObjectURL( blobURLref); }
上記例では1つのblob URLに複数回参照できます。
Web開発者は両方の画像オブジェクトのロード完了後にblob
URL文字列を破棄します。
blob URLの利用回数に制限を設けないことで柔軟性は増しますが、
リークの可能性も高まるため、
対応するURL.
呼び出しを組み合わせるべきです。
revokeObjectURL()
9. セキュリティとプライバシーに関する考慮事項
この節は参考情報です。
本仕様は、ウェブコンテンツが基盤となるファイルシステムからファイルを読み込むことを許可し、
ファイルを一意の識別子でアクセスする手段も提供するため、いくつかのセキュリティ上の考慮事項が生じます。
本仕様では主なユーザー操作はHTMLフォームの<input type="file"/>
要素
[HTML]を通じて行われることを前提とし、
FileReader
オブジェクトで読み込まれる全ファイルは、ユーザーによって選択済みであるものとします。
重要なセキュリティ上の考慮事項には、悪意あるファイル選択攻撃(選択ループ)の防止、
システム重要ファイルへのアクセス防止、
選択後のディスク上ファイルの改変防止などが含まれます。
- 選択ループ防止
-
ファイル選択時、ユーザーが
<input type="file"/>
に関連付けられたファイルピッカーによって繰り返し選択を強いられる(ファイルピッカーが閉じられる前に選択を強制される「強制選択」ループ)場合、 ユーザーエージェントは、返されるFileList
オブジェクトのサイズを0にすることでファイルアクセスを防止できます。 - システム重要ファイル
-
(例:/usr/bin内のファイル、パスワードファイル、その他OSの実行ファイルなど) は一般的にウェブコンテンツへ公開すべきではなく、 blob URL経由でもアクセスすべきではありません。 ユーザーエージェントは同期読み込みメソッドで
SecurityError
例外をthrowしたり、 非同期読み込みでSecurityError
例外を返すことがあります。
この節は暫定的なものであり、将来の草案でより多くのセキュリティ情報が補足される可能性があります。
10. 要件とユースケース
この節では、本APIの要件と、いくつかのユースケース例を示します。 このバージョンのAPIはすべてのユースケースを満たすものではなく、 今後のバージョンで追加対応する場合があります。
-
ユーザーが権限を与えた後は、 ユーザーエージェントはローカルファイルからデータをプログラムで直接読み込み・解析できる機能を提供すべきです。
-
データはローカルに保存可能であるべきで、後で利用できるようにすることで ウェブアプリのオフラインデータアクセスにも役立ちます。
-
ユーザーエージェントはデータとファイル名を指定してローカルファイルをプログラムで保存できる機能を提供すべきです。
注: 本仕様には明示的なダウンロードAPIはありませんが、HTML5仕様で対応済みです。
download
属性を付与したa
要素でダウンロードが開始され、File
の名前も指定できます。 本APIとdownload
属性付きa
要素の組み合わせでウェブアプリ内でファイル生成・ローカル保存が可能となります。 -
ユーザーエージェントは、ファイルからリモートサーバにデータを効率的に送信できるプログラムAPIを提供すべきです(従来のフォームアップロードより効率的)。
-
ユーザーエージェントは上記機能をスクリプトから利用できるAPIを公開すべきです。 ファイルシステムとのやりとりが発生した際は必ずUIで通知し、 ユーザーは取引のキャンセル・中断が可能。 ファイル選択時にも通知し、キャンセルできる。 これらAPIはユーザーの関与なしにサイレントに呼び出されることはありません。
謝辞
本仕様はSVGワーキンググループにより初期開発されました。Mark Baker氏、Anne van Kesteren氏のフィードバックに感謝します。
Robin Berjon氏、Jonas Sicking氏、Vsevolod Shmyroff氏による初期仕様編集に感謝します。
Olli Pettay氏、Nikunj Mehta氏、Garrett Smith氏、Aaron Boodman氏、Michael Nordman氏、Jian Li氏、Dmitry Titov氏、Ian Hickson氏、Darin Fisher氏、Sam Weinig氏、Adrian Bateman氏、Julian Reschke氏に特別な感謝を。
W3C WebApps WGおよびpublic-webapps@w3.orgリスト参加者にも感謝します。