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 ; // slice Blob into byte-ranged chunksBlob slice (optional [Clamp ]long long ,start optional [Clamp ]long long ,end optional DOMString ); // read from the Blob. [contentType NewObject ]ReadableStream stream (); [NewObject ]Promise <USVString >text (); [NewObject ]Promise <ArrayBuffer >arrayBuffer (); [NewObject ]ReadableStream textStream (); [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 の新しい
ReadableStreamとし、blob の関連するレルムで作成されたものとする。 -
セットアップ stream をバイト読み取り対応で行う。
-
以下の手順を並列に実行する:
-
blob のすべてのバイトが読み取られていない間:
-
bytes を、blob から得られるバイト列、すなわちチャンクを 1 つ読み取った結果とし、チャンクを読み取れない場合は 失敗とする。
-
グローバルタスクをキューに入れ、ファイル読み取りタスクソース上で、 blob の 関連するグローバルオブジェクトを指定して、 以下の手順を実行する:
-
bytes が失敗である場合、stream をエラーにする。このとき、 失敗理由をエラーの値として用い、その後、 これらの手順を中止する。
-
chunk を、新しい
Uint8Arrayとし、bytes を含むArrayBufferをラップする。もしArrayBufferの作成が例外をスローした場合、その例外で stream をエラーにし、 これらの手順を中止する。 -
chunk をエンキューして、 stream に入れる。
-
Blob からの読み取りが実際に何を行うのか、どのようなエラーが発生し得るのか、 おそらくチャンクサイズなどについても、より具体的に仕様化する必要がある。
-
-
-
stream を返す。
3.1. コンストラクター
Blob()
コンストラクターは、0 個以上の引数を指定して呼び出すことができる。
Blob()
コンストラクターが呼び出されたとき、
ユーザーエージェントは、以下の手順を実行しなければならない:
3.1.1. コンストラクターパラメーター
Blob()
コンストラクターは以下のパラメーターで呼び出せます:
blobPartssequence-
以下の型の要素を任意の数・順序で受け取ります:
-
BufferSource要素。 -
Blob要素。 -
USVString要素。
-
- 省略可能な
BlobPropertyBag -
以下の省略可能なメンバーを受け取ります:
-
type:Blobのメディア型を表すASCII小文字列。このメンバーの規定は § 3.1 コンストラクター 参照。 -
endings,"transparent"または"native"の値を取ることができる列挙型である。 デフォルトでは、これは"transparent"に設定される。"native"に設定されている場合、blobParts内の任意の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()の呼び出しを通じて、Web アプリケーション自体によって設定できる。 これらの場合、この属性に関する追加の規範的条件は、それぞれ § 3.1 コンストラクター、 § 4.1 コンストラクター、 および § 3.3.1 slice() メソッドにある。 ユーザーエージェントは、type、すなわちBlobの型も決定でき、 特にそのバイト列がディスク上のファイルからのものである場合が該当する。 この場合、追加の規範的条件はファイル型ガイドラインにある。注:
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でラップ)を返す。
3.3.6.
textStream()
メソッド
textStream() メソッドの手順は次のとおりです:
-
stream を、get stream を this に対して呼び出した結果とする。
-
decoder を、this の 関連レルム内の新しい
TextDecoderStreamとする。 -
stream を decoder にpipe through した結果を返す。
注: これは readAsText()
とは異なり、常に UTF-8 エンコーディングを使用する。
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 を、
fileBitsおよびoptionsを指定してblob 部分を処理した結果とする。 -
n を、コンストラクターへの
fileName引数とする。注: 基盤となる OS のファイルシステムでは、 ファイル名について異なる規則が使用される。 構築されたファイルでは、UTF-16 を必須とすることで、ファイル名がバイト 列に変換される際の曖昧さが軽減される。
-
FilePropertyBag辞書引数を、以下の下位手順を実行して処理する:-
typeメンバーが指定され、かつ空文字列でない場合、 t をtype辞書メンバーに設定する。 t に U+0020 から U+007E の範囲外の文字が含まれている場合、 t を空文字列に設定し、これらの下位手順から戻る。 -
t 内のすべての文字をASCII 小文字に変換する。
-
lastModifiedメンバーが指定されている場合、 d をlastModified辞書メンバーに設定する。 指定されていない場合、 d を、Unix エポックからのミリ秒数として表される 現在の日付と時刻に設定する (これはDate.now()[ECMA-262] と同等である)。注: ECMA-262 の
Dateオブジェクトは、Unix エポックからのミリ秒数を表す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()
コンストラクターは以下のパラメーターで呼び出せます:
fileBitssequence-
以下の要素を任意の数・順序で受け取ります:
-
BufferSource要素。 -
USVString要素。
-
fileNameパラメーターUSVString型でファイル名を表します。規定は § 4.1 コンストラクター を参照してください。- 省略可能な
FilePropertyBag辞書 -
BlobPropertyBagのメンバーに加えて、 1 つのメンバーを持つ:-
省略可能な
lastModifiedメンバーであり、long longでなければならない。 このメンバーに関する規範的条件は、§ 4.1 コンストラクターに規定されている。
-
4.2. 属性
name, 型 DOMString, 読み取り専用- ファイルの名前。
取得時はファイル名(文字列)を返します。
OSファイルシステムごとに様々なファイル名表現や規約がありますが、ここではパス情報を含まない単なる名前です。
取得時に情報が取得できない場合は空文字列を返します。
Fileオブジェクトがコンストラクターで生成された場合、詳細な規定は § 4.1 コンストラクター にあります。 lastModified, 型 long long, 読み取り専用- ファイルの最終更新日時。
取得時に、ユーザーエージェントがこの情報を利用可能にできる場合、
これはファイルが最後に更新された時刻を Unix
エポックからのミリ秒数として設定した
long longを返さなければならない。 最終更新日時が不明な場合、 この属性は現在の日付と時刻を Unix エポックからのミリ秒数を表すlong longとして返さなければならない。 これはDate[ECMA-262] と同等である。. now() Fileオブジェクトがコンストラクターを使用して作成された場合、 この属性に関する追加の規範的条件は § 4.1 コンストラクターにある。
File
インターフェイスは、FileList
型の属性を公開するオブジェクト上で利用可能である。
これらのオブジェクトは HTML の [HTML] に定義されている。
File
インターフェイスは、Blob
から継承し、変更不可能(immutable)であり、
したがって、read operation
が開始された時点でメモリに読み込むことができるファイルデータを表す。
ユーザーエージェントは、読み取り時点で既に存在しないファイルに対する読み取りを errors として処理し、
Web Worker 上で 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は、ユーザーエージェントによってFileオブジェクトのFileList内での位置を表す値として扱われなければならず、 0 は最初のファイルを表す。 サポートされるプロパティインデックスは、 0 からFileListオブジェクトによって表されるFileオブジェクトの数より 1 少ない数までの範囲の数である。 そのようなFileオブジェクトが存在しない場合、 サポートされるプロパティインデックスは存在しない。
注: HTMLInputElement
インターフェイスは FileList
型の読み取り専用属性を持っており、上記例でアクセスされています。
FileList
型の読み取り専用属性を持つ他のインターフェイスには、
DataTransfer
インターフェイスなどがあります。
6. データの読み込み
6.1. ファイル読み込みタスクソース
本仕様は新しい汎用 タスクソースである ファイル読み込みタスクソース を定義します。
これは本仕様でキューされるすべての タスクで、
Blob や File
オブジェクトに関連付けられたバイト列を読み取るために利用されます。
バイナリデータの非同期読み取りに反応して発火する機能に使用されます。
6.2. FileReader
API
[Exposed =(Window ,Worker )]interface :FileReader EventTarget {constructor (); // async read methodsundefined readAsArrayBuffer (Blob );blob undefined readAsBinaryString (Blob );blob undefined readAsText (Blob ,blob optional DOMString );encoding undefined readAsDataURL (Blob );blob undefined abort (); // statesconst unsigned short = 0;EMPTY const unsigned short = 1;LOADING const unsigned short = 2;DONE readonly attribute unsigned short readyState ; // File or Blob datareadonly attribute (DOMString or ArrayBuffer )?result ;readonly attribute DOMException ?error ; // event handler content attributesattribute 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 には、関連付けられた read
operation アルゴリズムがあり、
これは blob、type、および省略可能な encodingLabel が与えられたときに、
次の手順を実行する:
-
もし fr の state が
"loading"なら、InvalidStateErrorDOMExceptionを投げる。 -
fr の state を
"loading"に設定する。 -
fr の result を
nullに設定する。 -
fr の error を
nullに設定する。 -
stream を、blob に対して get stream を呼び出した結果とする。
-
reader を、stream から getting a reader を行った結果とする。
-
bytes を空の byte sequence とする。
-
chunkPromise を、reader を用いて stream から reading a chunk を行った結果とする。
-
isFirstChunk を true とする。
-
In parallel に、true の間次を行う:
-
chunkPromise が fulfilled または rejected になるまで待つ。
-
もし chunkPromise が fulfilled で、かつ isFirstChunk が true なら、 queue a task をして、fire a progress event と呼ばれる
loadstartを fr に対して発火する。我々は
loadstartを同期的にディスパッチするよう変更する可能性がある。 これは XMLHttpRequest の挙動に合わせるためである。 [Issue #119] -
isFirstChunk を false に設定する。
-
もし chunkPromise が、
doneプロパティが false で、valueプロパティがUint8Arrayオブジェクトであるオブジェクトで fulfilled されたなら、次の手順を実行する:-
bs を、その
Uint8Arrayオブジェクトで表される byte sequence とする。 -
bs を bytes に追加する。
-
おおよそ 50ms が直前にこれらの手順が呼び出されてから経過している場合、 queue a task をして、fire a progress event と呼ばれる
progressを fr に対して発火する。 -
chunkPromise を、reader を用いて stream から reading a chunk を行った結果に設定する。
-
-
それ以外の場合、もし chunkPromise が
doneプロパティが true のオブジェクトで fulfilled されたなら、 次の手順を実行するために queue a task をし、このアルゴリズムを中止する:-
fr の state を
"done"に設定する。 -
result を、 package data の結果(引数は bytes、 type、blob の
type、 および encodingLabel)とする。 -
もし package data が例外 error を投げたなら:
-
fr の error を error に設定する。
-
Fire a progress event と呼ばれる
errorを fr に対して発火する。
-
-
それ以外の場合:
-
fr の result を result に設定する。
-
Fire a progress event と呼ばれる
loadを fr に対して発火する。
-
-
もし fr の state が
"loading"でないなら、 fire a progress event と呼ばれるloadendを fr に対して発火する。Note:
loadまたはerrorイベントのイベントハンドラーが別の読み込みを開始している可能性がある。 その場合、この読み込みに対するloadendイベントは発火されない。
-
-
それ以外の場合、もし chunkPromise がエラー error で rejected されたなら、 次の手順を実行するために queue a task をし、このアルゴリズムを中止する:
-
fr の state を
"done"に設定する。 -
fr の error を error に設定する。
-
Fire a progress event と呼ばれる
errorを fr に対して発火する。 -
もし fr の state が
"loading"でないなら、 fire a progress event と呼ばれるloadendを fr に対して発火する。Note:
errorイベントのイベントハンドラーが別の読み込みを開始している可能性がある。 その場合、この読み込みに対するloadendイベントは発火されない。
-
-
これらすべてのタスクには file reading task source を使用する。
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 からのものとして、 関連付けられた タスクキュー 内の ファイル読み取りタスクソース 上に存在する場合、 それらの タスク をそのタスクキューから削除する。
-
処理中の read メソッド のアルゴリズムを 終了する。
-
進行イベントを 発火する。これは
abortと呼ばれ、this で発火される。 -
this の 状態 が
"loading"でない場合、loadendと呼ばれる進行イベントを 発火する。これは this で発火される。
6.3. データのパッケージ化
Blob には、
bytes、type、mimeType、および省略可能な encodingLabel を受け取る、
関連付けられた パッケージデータアルゴリズムがあり、
これは type に応じて分岐し、関連付けられた手順を実行する:
- DataURL
-
以下の考慮事項に従って、bytes を DataURL として返す [RFC2397]:
-
mimeType が空文字列でない場合は、Data URL 仕様 [RFC2397] に従って、Data URL の一部として mimeType を使用する。
-
それ以外の場合は、メディアタイプのない Data URL を返す。[RFC2397]。
DataURL が どのように生成されるかを、より適切に規定する。[課題 #104]
-
- Text
-
-
encoding を失敗とする。
-
encodingLabel が存在する場合は、encoding を encodingLabel からエンコーディングを取得した結果に設定する 。
-
encoding が失敗の場合:
-
type を、 mimeType を与えてMIME タイプを構文解析する結果とする 。
-
type が失敗でない場合は、 encoding を、type のパラメーター[
"charset"] からエンコーディングを取得した 結果に設定する。blobにtype属性としてtext/plain;charset=utf-8がある場合、ラベルとして"utf-8"を使用してエンコーディングを取得する処理が実行される 。 ユーザーエージェントは、エンコーディングのラベルを構成する Charset パラメーター の部分を構文解析して抽出しなければならないことに注意すること。
-
-
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は読み取りの完了時に発火するが、 以下のいずれかが真である場合を除く:-
loadイベントのイベントハンドラー関数が新しい読み取りを開始した場合 -
errorイベントのイベントハンドラー関数が新しい読み取りを開始した場合。
注:
loadstartイベントとloadendイベントは一対一で対応しているわけではない。この例は「読み取りの連鎖」を示している: 「最初の」読み取りが処理を継続している間に、イベントハンドラー内から別の読み取りを開始する。// 次のようなコードでは... reader. readAsText( file); reader. onload= function (){ reader. readAsText( alternateFile);} ..... //... 最初の読み取りについて loadend イベントは発火してはならない reader. readAsText( file); reader. abort(); reader. onabort= function (){ reader. readAsText( updatedFile);} //... 最初の読み取りについて loadend イベントは発火してはならない -
blobが完全にメモリへ読み込まれたとき、1 つのprogressイベントが発火する。 -
abort、load、 およびerrorのいずれかが発火した後にprogressイベントが発火することはない。 特定の読み取りについて、abort、load、 およびerrorのうち発火するのは最大でも 1 つである。
6.5. スレッドでの読み込み
Web Workers は、同期的な File や Blob 読み取り API
の使用を可能にする。これは、スレッド上での読み取りがメインスレッドをブロックしないためである。
この節では、Workers [Workers] 内で使用できる同期
API を定義する。
Workers は、非同期 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
文字列であるパスを持つ。
top-level-navigation"、または
"top-level-self-fetch" である environment が与えられた場合、次の手順を実行する。これらは
オブジェクトを返す。
-
isAuthorized を true とする。
-
environment が 環境である場合、isAuthorized を blobUrlEntry と environment を用いて同一パーティションの 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 が 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リスト参加者にも感謝します。