ファイル API

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-FileAPI-20241204/
最新公開バージョン:
https://www.w3.org/TR/FileAPI/
編集者ドラフト:
https://w3c.github.io/FileAPI/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/FileAPI/
フィードバック:
GitHub
仕様内インライン
編集者:
(Google)
前編集者:
Arun Ranganathan (Mozilla Corporation)
テスト:
web-platform-tests FileAPI/ (進行中の作業)

概要

この仕様は、ウェブアプリケーションでファイルオブジェクトを表現するAPIを提供し、プログラムでそれらを選択し、データへアクセスできるようにします。これには以下が含まれます:

さらに、この仕様はスレッド化されたウェブアプリケーション内でファイルを同期的に読み込むためのオブジェクトも定義します。

§ 10 要件とユースケースで本仕様の動機を説明しています。

このAPIは、ウェブプラットフォーム上の他のAPIや要素、特に XMLHttpRequest (例えば send() メソッドの FileBlob 引数のオーバーロード)、postMessage()DataTransfer[HTML]で定義されているドラッグ&ドロップAPIの一部)やWeb Workersと組み合わせて利用されることを想定しています。 また、input 要素が ファイルアップロード 状態のときに、プログラムでファイル一覧を取得できる必要があります [HTML]。 これらの振る舞いは、関連する仕様で定義されています。

この文書のステータス

このセクションは、本書が公開された時点での文書のステータスを説明します。現行のW3C刊行物の一覧や、この技術レポートの最新版は、W3C技術レポートインデックス(https://www.w3.org/TR/)でご覧いただけます。

この文書は、Web Applications Working Groupによって作業草案として公開されました。この文書はW3C勧告となる予定です。

この仕様については、以前二つのメーリングリストで議論されました:public-webapps@w3.orgアーカイブ)とpublic-webapi@w3.orgアーカイブ)。今後の議論はpublic-webapps@w3.orgメーリングリスト上で行われます。

この草案は、前回のLast Call Working Draftへの変更で構成されています。ご意見はpublic-webapi@w3.orgへ上記の方法でお寄せください。Last CallへのフィードバックはW3C Wikiでご覧いただけます:https://www.w3.org/wiki/Webapps/LCWD-FileAPI-20130912

実装レポートはテストスイートから自動生成されます。

この文書は、Web Applications Working Groupによって、勧告トラックを用いて作業草案として公開されました。 本仕様へのフィードバック、ご意見はGitHub Issuesで受け付けています。過去の議論はpublic-webapps@w3.orgアーカイブにあります。

作業草案として公開されたことは、W3Cや会員による承認を意味しません。本書はドラフト文書であり、随時更新・差替え・廃止される場合があります。本書を進行中の作業以外のものとして引用することは適切ではありません。

この文書は、W3C特許ポリシーの下で運営されるグループによって作成されました。W3Cは、グループの成果物に関して行われた特許開示の公開リストを管理しています;そのページには特許開示方法も記載されています。個人が、実際に特許を知っており、その特許が必要な請求項を含むと考える場合は、W3C特許ポリシー第6節に従って情報を開示する必要があります。

この文書は2023年11月3日 W3Cプロセス文書によって管理されています。

1. はじめに

このセクションは参考情報です。

ウェブアプリケーションは、ユーザーがリモートサーバーにアップロードしたいファイルや、リッチなウェブアプリケーション内で操作したいファイルなど、できるだけ幅広いユーザー入力を操作できる能力を持つべきです。 本仕様は、ファイルの基本的な表現、ファイルリスト、ファイルアクセスによって発生するエラー、およびファイルをプログラムで読み取る方法を定義します。 さらに、本仕様は「生データ」を表すインターフェイスも定義しており、現行標準に準拠したユーザーエージェントのメインスレッドで非同期的に処理できます。 本仕様で定義されるインターフェイスやAPIは、ウェブプラットフォームで公開されている他のインターフェイスやAPIと組み合わせて利用できます。

File インターフェイスは通常、基盤となるファイルシステムから取得したファイルデータを表し、 Blob インターフェイス (「Binary Large Object」— この名称は Google Gears でウェブAPIに初めて導入されました) は変更不可能な生データを表します。FileBlob の読み込みは、メインスレッド上で非同期的に行うべきであり、スレッド化されたウェブアプリケーション内ではオプションで同期APIも利用できます。 ファイルの非同期APIを利用することで、ユーザーエージェントのメインスレッドがブロックされたり、UIが「フリーズ」するのを防げます。 本仕様は、イベントモデルに基づいた非同期APIを定義し、FileBlob のデータを読み取ったりアクセスできます。 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() の呼び出しで終了することができます。

この仕様書のアルゴリズムとステップでは、以下の数学的演算を使用します:

Unix Epoch という用語は、 本仕様書では 1970年1月1日 00:00:00 UTC (または 1970-01-01T00:00:00Z ISO 8601)を指します。 これは ECMA-262 [ECMA-262] で概念的に "0" とされる時刻と同じです。

slice blob アルゴリズムは、 Blob blobstartendcontentType を受け取り、 次のステップを参照し、start パラメーターから end パラメーター(未満)までのバイトを含む新しい Blob を返します。動作は以下の通りです:
  1. originalSizeblobsize とする。

  2. start パラメーターが null でない場合は slice blob の開始点となる値であり、バイト順序位置として扱う。ゼロ番目の位置が最初のバイトを示す。ユーザーエージェントは以下の方法で start を正規化しなければならない:

    1. start が null の場合、relativeStart を 0 とする。
    2. start が負の場合、relativeStartmax((originalSize + start), 0) とする。
    3. それ以外の場合、relativeStartmin(start, originalSize) とする。
  3. end パラメーターが null でない場合は slice blob の終了点となる値である。ユーザーエージェントは以下の方法で end を正規化しなければならない:

    1. end が null の場合、relativeEndoriginalSize とする。
    2. end が負の場合、relativeEndmax((originalSize + end), 0) とする。
    3. それ以外の場合、relativeEndmin(end, originalSize) とする。
  4. contentType パラメーターが null でない場合は、Blob のメディア型を表すASCII小文字列として設定される。ユーザーエージェントは以下の方法で contentType を正規化しなければならない:

    1. contentType が null の場合、relativeContentType を空文字列にする。
    2. それ以外の場合、relativeContentTypecontentType を設定し、次のサブステップを実行する:
      1. relativeContentType に U+0020 から U+007E 以外の文字が含まれていたら、relativeContentType を空文字列にしてこれらのサブステップから戻る。

      2. relativeContentType の全ての文字を ASCII小文字 に変換する。

  5. spanmax((relativeEnd - relativeStart), 0) とする。

  6. 以下の特徴を持つ新しい Blob オブジェクト S を返す:

    1. S は、blob の関連付けられた バイト列のうち、バイト順序位置 relativeStart から始まる span 連続する バイトを参照する。
    2. S.size = span
    3. S.type = relativeContentType

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 contentType);

  // Blobから読み込む
  [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オブジェクトはシリアライズ可能オブジェクトです。そのシリアライズ手順は、valueserializedが与えられた場合、次の通りです:

  1. serialized.[[SnapshotState]]にvalueスナップショット状態を設定する。

  2. serialized.[[ByteSequence]]にvalueの基盤となるバイト列を設定する。

そのデシリアライズ手順は、serializedvalueが与えられた場合、次の通りです:

  1. valueスナップショット状態serialized.[[SnapshotState]]を設定する。

  2. valueの基盤となるバイト列にserialized.[[ByteSequence]]を設定する。

Blob blobには関連するget streamアルゴリズムがあり、次のステップを実行します:
  1. streamblob関連Realmで新しく作成されたReadableStreamとする。

  2. バイト読み込み対応で streamをセットアップする。

  3. 以下のステップを並列で実行:

    1. blobの全バイトが読み込まれるまで:

      1. bytesblobからチャンクを読み込むことで得られるバイト列とし、チャンクが読み込めない場合は失敗とする。

      2. グローバルタスクをキューに入れるblob関連グローバルオブジェクトで、次のステップを実行:

        1. bytesが失敗なら、stream失敗理由でエラーにし、 これらのステップを中断する。

        2. chunkを新しいUint8ArrayArrayBufferbytesをラップ)とする。ArrayBufferの生成で例外が発生したら、その例外でstreamをエラーにし、これらのステップを中断する。

        3. chunkstreamにエンキューする。

      Blobからの読み込みで実際に何が起こるか、どんなエラーが発生するか、チャンクサイズなどについてより具体的に規定する必要があります。

  4. streamを返す。

3.1. コンストラクター

Blob() コンストラクターは0個以上のパラメーターで呼び出せます。 Blob() コンストラクターが呼び出されたとき、 ユーザーエージェントは以下のステップを実行しなければなりません:
  1. パラメーターが0個の場合、 0バイトからなる新しい Blob オブジェクトを返すこと。 size は0に設定し、 type は空文字列に設定すること。

  2. bytesblobPartsoptionsblob 部分の処理で得ること。

  3. type メンバーが空文字列でない場合、 次のサブステップを実行:

    1. ttype 辞書メンバーとする。 tにU+0020~U+007E以外の文字が含まれていれば、tを空文字列にしてサブステップから戻る。

    2. tの全ての文字をASCII小文字に変換する。

  4. 以下の特徴を持つ Blob オブジェクトを返すこと:関連付けられた byte 列として bytes を参照し、 sizebytes の長さに設定し、 type は上記サブステップの t の値に設定すること。

3.1.1. コンストラクターパラメーター

Blob() コンストラクターは以下のパラメーターで呼び出せます:

blobParts sequence
以下の型の要素を任意の数・順序で受け取ります:
省略可能な BlobPropertyBag
以下の省略可能なメンバーを受け取ります:
blob 部分の処理は、BlobPart の sequence partsBlobPropertyBag options を受け取り、 以下のステップを実行します:
  1. bytes を空のバイト列とする。

  2. parts の各 element について:

    1. elementUSVString の場合、以下のサブステップを実行:

      1. selement とする。

      2. optionsendings メンバーが "native" なら、 sネイティブ形式に改行を変換した結果にする。

      3. sUTF-8 エンコードした結果を bytes に追加する。

        注: WebIDL [WebIDL] のアルゴリズムは、無効なutf-16文字列の合致しないサロゲートをU+FFFD置換文字に置換します。 Blob コンストラクターでデータ損失(文字化け等)が発生する場合があります。

    2. elementBufferSource の場合、 バッファのバイトのコピーを取得し、それらのバイトを bytes に追加する。

    3. elementBlob の場合、 そのバイト列を bytes に追加する。

      注: Blob 配列要素の type は無視され、返される Blob オブジェクトの type には影響しません。

  3. bytes を返す。

ネイティブ形式に改行を変換は、文字列 s を受け取り、 以下のステップを実行します:
  1. native line ending符号位置 U+000A LF とする。

  2. 基盤となるプラットフォームの改行表現がキャリッジリターン+LFの場合、 native line ending符号位置 U+000D CR + 符号位置 U+000A LF に設定する。

  3. result を空の文字列にする。

  4. positions位置変数とし、初期値は s の先頭。

  5. token を、position から s において U+000A LF または U+000D CR でない符号位置の並びを 収集した結果とする。

  6. tokenresult に追加。

  7. positions の末尾を超えていない間:

    1. position符号位置 が U+000D CR の場合:

      1. native line endingresult に追加。

      2. position を1進める。

      3. position が末尾を超えておらず、position符号位置 が U+000A LF なら、さらに1進める。

    2. それ以外で position符号位置 が U+000A LF なら、1進めて native line endingresult に追加。

    3. token を、position から s において U+000A LF または U+000D CR でない符号位置を収集した結果とする。

    4. tokenresult に追加。

  8. 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 列のバイト数を返します。 取得時、準拠するユーザーエージェントは FileReaderFileReaderSync オブジェクトで読み取れるバイト総数を返すか、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 属性の利用はパッケージデータアルゴリズムに通知され、 fetchblob URLを取得する際の Content-Type ヘッダーが決定されます。

3.3. メソッドとパラメーター

3.3.1. slice() メソッド

slice() メソッドは オプションの start パラメーターから オプションの end パラメーター(未満)までのバイトと、 オプションの contentType パラメーターを値とする type 属性を持つ 新しい Blob オブジェクトを返します。動作は次の通りです:
  1. sliceStartsliceEndsliceContentType を null にする。

  2. start が与えられた場合、sliceStartstart を設定。

  3. end が与えられた場合、sliceEndend を設定。

  4. contentType が与えられた場合、sliceContentTypecontentType を設定。

  5. 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 streamthis に対して呼び出した結果を返さなければなりません。

3.3.3. text() メソッド

text() メソッドは呼び出されると、以下のステップを実行します:

  1. get streamthis に対して呼び出した結果の stream を取得する。

  2. readerreader取得stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。

  3. promise全バイト読み出しstreamreader で取得する。

  4. promise の fulfill時にその最初の引数へ UTF-8デコード を実行した結果を返す。

注: この動作は readAsText() とは異なり、 Fetchのtext() とより一致するよう調整されています。 このメソッドは必ずUTF-8を使用しますが、FileReader はblobのtypeや渡されたencoding名によって異なるエンコーディングを利用できます。

3.3.4. arrayBuffer() メソッド

arrayBuffer() メソッドは呼び出されると、以下のステップを実行します:

  1. get streamthis に対して呼び出した結果の stream を取得する。

  2. readerreader取得stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。

  3. promise全バイト読み出しstreamreader で取得する。

  4. promise の fulfill時にその最初の引数を内容とする新しい ArrayBuffer を返す。

3.3.5. bytes() メソッド

bytes() メソッドは呼び出されると、以下のステップを実行します:

  1. get streamthis に対して呼び出した結果の stream を取得する。

  2. readerreader取得stream から取得する。 例外が発生した場合は、その例外でリジェクトされた新しいPromiseを返す。

  3. promise全バイト読み出しstreamreader で取得する。

  4. promise の fulfill時にその最初の引数を内容とする新しい Uint8ArrayArrayBuffer でラップ)を返す。

4. Fileインターフェイス

File オブジェクトは Blob オブジェクトであり、 name 属性(文字列)を持ちます。 ウェブアプリケーション内でコンストラクターにより作成するか、 または基盤の(OS)ファイルシステムのファイル由来のバイト列への参照となります。

File オブジェクトがディスク上のファイル由来のバイト列参照の場合、 スナップショット状態File オブジェクト作成時の ディスク上のファイルの状態に設定すべきです。

注: これはユーザーエージェント実装にとって容易ではなく、 must ではなく should としています [RFC2119]。 ユーザーエージェントは File オブジェクトの スナップショット状態を 参照取得時のディスクの状態に設定するよう努めるべきです。 参照取得後にディスク上のファイルが変更された場合、 Fileスナップショット状態は 基盤ストレージの状態と異なるものとなります。 ユーザーエージェントは更新日時や他の仕組みを用いて スナップショット状態を管理してもよいですが、これは実装詳細です。

File オブジェクトがディスク上のファイル参照の場合、 ユーザーエージェントはそのファイルの type を返し、 以下のファイル型ガイドラインに従わなければなりません:

[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 オブジェクトは シリアライズ可能オブジェクトです。そのシリアライズ手順valueserialized が与えられた場合:

  1. serialized.[[SnapshotState]] に valueスナップショット状態を設定する。

  2. serialized.[[ByteSequence]] に value の基盤となるバイト列を設定する。

  3. serialized.[[Name]] に valuename 属性の値を設定する。

  4. serialized.[[LastModified]] に valuelastModified 属性の値を設定する。

デシリアライズ手順は、valueserialized が与えられた場合:

  1. valueスナップショット状態serialized.[[SnapshotState]] を設定する。

  2. value の基盤となるバイト列に serialized.[[ByteSequence]] を設定する。

  3. valuename 属性の値を serialized.[[Name]] で初期化する。

  4. valuelastModified 属性の値を serialized.[[LastModified]] で初期化する。

4.1. コンストラクター

File コンストラクターは2つまたは3つのパラメーター(辞書型は省略可)で呼び出します。 File() コンストラクターが呼び出されたとき、 ユーザーエージェントは以下のステップを実行します:
  1. bytesblob 部分の処理fileBitsoptions を用いて得る。

  2. n をコンストラクター引数 fileName とする。

    注: OSファイルシステムはファイル名表現が異なります。 構築されたファイルではUTF-16を必須にすることでファイル名のバイト列変換時の曖昧さを減らします。

  3. FilePropertyBag 辞書引数を次のサブステップで処理:

    1. type メンバーが空文字列でない場合、 ttype 辞書メンバー値に設定。 t にU+0020~U+007E以外の文字が含まれていれば t を空文字列にしてサブステップから戻る。

    2. t の全ての文字をASCII小文字に変換。

    3. lastModified メンバーが指定されていれば dlastModified 辞書メンバー値に設定。 指定されていない場合は、現在日時(Unix Epochからのミリ秒数。Date.now() [ECMA-262]と同等)に設定。

      注: ECMA-262 Date オブジェクトはUnix Epochからのミリ秒数の long long値に変換されるため、 lastModified メンバーは Date オブジェクトでもよい [ECMA-262]

  4. 新しい File オブジェクト F を返す。条件:

    1. Fbytes バイト列を参照。

    2. F.sizebytes のバイト総数を設定。

    3. F.namen を設定。

    4. F.typet を設定。

    5. F.lastModifiedd を設定。

4.1.1. コンストラクターパラメーター

File() コンストラクターは以下のパラメーターで呼び出せます:

fileBits sequence
以下の要素を任意の数・順序で受け取ります:
fileName パラメーター
USVString 型でファイル名を表します。規定は § 4.1 コンストラクター を参照してください。
省略可能な FilePropertyBag 辞書
BlobPropertyBag のメンバーに加え、以下のメンバーを持ちます:

4.2. 属性

name, DOMString, 読み取り専用
ファイルの名前。 取得時はファイル名(文字列)を返します。 OSファイルシステムごとに様々なファイル名表現や規約がありますが、ここではパス情報を含まない単なる名前です。 取得時に情報が取得できない場合は空文字列を返します。 File オブジェクトがコンストラクターで生成された場合、詳細な規定は § 4.1 コンストラクター にあります。
lastModified, long long, 読み取り専用
ファイルの最終更新日時。 取得時、ユーザーエージェントがこの情報を取得できる場合は、ファイルの最終更新時刻(Unix Epochからのミリ秒数)を long long 型で返します。 更新日時が不明な場合は、現在日時(Unix Epochからのミリ秒数)を long long 型で返します。これは Date.now() [ECMA-262] と同等です。 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.item(0)のような構文はリスクがありますが、 他のほとんどの FileList のプログラム的利用は、 最終的に Array型へ移行しても影響を受ける可能性は低いです。

このインターフェイスは File オブジェクトのリストです。

[Exposed=(Window,Worker), Serializable]
interface FileList {
  getter File? item(unsigned long index);
  readonly attribute unsigned long length;
};

FileList オブジェクトはシリアライズ可能オブジェクトです。そのシリアライズ手順valueserialized が与えられた場合:

  1. serialized.[[Files]] に空のリストを設定する。

  2. value の各 file について、fileサブシリアライズserialized.[[Files]] に追加する。

デシリアライズ手順serializedvalue が与えられた場合:

  1. fileserialized.[[Files]] から、 fileサブデシリアライズ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. ファイル読み込みタスクソース

本仕様は新しい汎用 タスクソースである ファイル読み込みタスクソース を定義します。 これは本仕様でキューされるすべての タスクで、 BlobFile オブジェクトに関連付けられたバイト列を読み取るために利用されます。 バイナリデータの非同期読み取りに反応して発火する機能に使用されます。

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 EMPTY = 0;
  const unsigned short LOADING = 1;
  const unsigned short DONE = 2;

  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 には 結果nullDOMStringArrayBuffer)があり、初期値は null です。

FileReader には エラーnull または DOMException)があり、初期値は null です。

FileReader() コンストラクターは呼び出されると新しい FileReader オブジェクトを返します。

readyState 属性のgetterは、 this状態ごとに次のステップを実行します:

"empty"

EMPTY を返す

"loading"

LOADING を返す

"done"

DONE を返す

result 属性のgetterは、 this結果を返します。

error 属性のgetterは、 thisエラーを返します。

FileReader fr には 読み込み操作アルゴリズムがあり、 blobtype、オプションのencodingNameを受け取り、以下のステップを実行します:
  1. fr状態"loading"の場合、 InvalidStateError DOMException を投げる。

  2. fr状態"loading"に設定。

  3. fr結果nullに設定。

  4. frエラーnullに設定。

  5. streamblobに対してget streamで取得。

  6. readerstreamからreader取得で取得。

  7. bytesを空のバイト列とする。

  8. chunkPromisestreamreaderチャンク読み出しの結果とする。

  9. isFirstChunkをtrueに設定。

  10. 並列で、trueの間:

    1. chunkPromiseのfulfilledまたはrejectedを待つ。

    2. chunkPromiseがfulfilledかつisFirstChunkがtrueの場合、タスクをキューし、loadstart進捗イベントをfrに発火。

      loadstart の同期発火に変更する可能性あり。XMLHttpRequestの挙動に合わせるため。[Issue #119]

    3. isFirstChunkをfalseに設定。

    4. chunkPromiseがfulfilledかつdoneがfalseでvalueUint8Arrayの場合:

      1. bsUint8Arrayバイト列とする。

      2. bsbytesに追加。

      3. 前回呼び出しから約50ms経過していれば、タスクをキューし、progress進捗イベントをfrに発火。

      4. chunkPromisestreamreaderチャンク読み出し結果で再設定。

    5. それ以外でchunkPromiseがfulfilledかつdoneがtrueの場合、タスクをキューし、次のステップを実行しこのアルゴリズムを終了:

      1. fr状態"done"に設定。

      2. resultbytestypeblobtypeencodingNameパッケージデータした結果とする。

      3. パッケージデータで例外errorが発生した場合:

        1. frエラーerrorを設定。

        2. error進捗イベントをfrに発火。

      4. それ以外の場合:

        1. fr結果resultを設定。

        2. load進捗イベントをfrに発火。

      5. fr状態"loading"でなければ、loadend進捗イベントをfrに発火。

        注: loaderrorイベントのハンドラーで新たな読み込みが開始された場合、この読み込みのloadendイベントは発火されない。

    6. それ以外でchunkPromiseがerrorでrejectedされた場合、タスクをキューし、次のステップを実行しこのアルゴリズムを終了:

      1. fr状態"done"に設定。

      2. frエラーerrorを設定。

      3. error進捗イベントをfrに発火。

      4. fr状態"loading"でなければ、loadend進捗イベントをfrに発火。

        注: errorイベントのハンドラーで新たな読み込みが開始された場合、この読み込みのloadendイベントは発火されない。

これらすべてのタスクでファイル読み込みタスクソースを利用すること。

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() で読み込みが中断された状態です。 FileReaderFileBlob をもう読み込んでいません。 readyStateDONE に設定されている場合は、この 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 に対して Textencoding読み込み操作を開始しなければなりません。

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() メソッドが呼ばれると、 ユーザーエージェントは以下のステップを実行しなければなりません:

  1. this状態"empty" または this状態"done" の場合、 this結果null に設定し、このアルゴリズムを終了する。

  2. this状態"loading" の場合、 this状態"done" に設定し、this結果null に設定する。

  3. もし タスクthis 由来で ファイル読み込みタスクソース の関連付けられた タスクキュー に存在する場合、 それらの タスク をそのタスクキューから削除する。

  4. 処理中の 読み込みメソッドアルゴリズムを終了する。

  5. abort進捗イベントを this に発火する。

  6. this状態"loading" でなければ、loadend進捗イベントを this に発火する。

6.3. データのパッケージ化

Blobパッケージデータアルゴリズムを持ちます。 bytestype、オプションのmimeType、オプションのencodingNameを受け取り、 typeごとに以下のステップを実行します:
DataURL

bytes を DataURL [RFC2397] として返す。ただし以下の考慮事項に従う:

  • Data URL の一部として mimeType が利用可能な場合は使用し、 Data URL仕様 [RFC2397] に従う。

  • mimeType が利用できない場合は、メディアタイプなしの Data URL を返す [RFC2397]

DataURL の生成仕様をより明確に規定する必要あり。[Issue #104]

Text
  1. encoding を失敗にする。

  2. encodingName が存在すれば、encodingencoding取得encodingName から得る。

  3. encoding が失敗で mimeType が存在する場合:

    1. typeMIME型解析mimeType から得る。

    2. type が失敗でなければ、 encodingencoding取得typeparameters["charset"] から得る。

      blobtype 属性が text/plain;charset=utf-8 なら、encoding取得"utf-8" ラベルで実行する。 ユーザーエージェントは Charsetパラメータのうち encodingのラベル部分のみ抽出・解析しなければならない。
  4. encoding が失敗なら encodingUTF-8 に設定。

  5. フォールバック encodingデコードし、bytes を返す。

ArrayBuffer

bytes を内容とする新しい ArrayBuffer を返す。

BinaryString

bytes をバイナリ文字列として返す。各バイトは [0..255] の値を持つコード単位として表現される。

6.4. イベント

FileReader オブジェクトは本仕様におけるすべてのイベントのイベントターゲットでなければなりません。

本仕様において 進捗イベントを発火する(ある ProgressEvent e を、指定した FileReader reader に対して発火する)と言った場合、以下が規定事項です:

6.4.1. イベント一覧

以下は 発火される FileReader オブジェクト上のイベントです。

イベント名 インターフェイス 発火タイミング
loadstart ProgressEvent 読み込みが開始されたとき
progress ProgressEvent blob の読み込み(およびデコード)中
abort ProgressEvent 読み込みが中断されたとき。 例えば abort() メソッドの呼び出しによる場合など。
error ProgressEvent 読み込みが失敗したとき(ファイル読み込みエラー参照)。
load ProgressEvent 読み込みが正常に完了したとき
loadend ProgressEvent リクエストが完了したとき(成功・失敗を問わず)

6.4.2. イベント不変条件まとめ

この節は参考情報です。

本仕様の非同期 読み込みメソッド に関する イベント発火の不変条件は以下の通りです:

  1. loadstart が発火したら、対応する loadend が読み込み完了時に発火します。ただし以下の場合は除く:

    注: loadstartloadend は1対1で対応するものではありません。

    この例は「リードチェイン」を示します。イベントハンドラ内で別の読み込みを開始し、最初の読み込みが継続する場合です。
    // 以下のようなコード…
    reader.readAsText(file);
    reader.onload = function(){reader.readAsText(alternateFile);}
    
    .....
    
    //... 最初の読み込みでは loadend イベントは発火しない
    
    reader.readAsText(file);
    reader.abort();
    reader.onabort = function(){reader.readAsText(updatedFile);}
    
    //... 最初の読み込みでは loadend イベントは発火しない
    
  2. progress イベントは blob がメモリに完全に読み込まれたときに1回発火します。

  3. progress イベントは loadstart より前には発火しません。

  4. progress イベントは abortloaderror のいずれかが発火した後には発火しません。 1つの読み込みについては abortloaderror のいずれか1つだけが発火します。

  5. abortloaderror イベントは loadend の後には発火しません。

6.5. スレッドでの読み込み

Web Workersでは、同期的な FileBlob の読み込みAPIが利用可能です。スレッド上の読み込みはメインスレッドをブロックしないためです。 この節ではWorkers内で利用できる同期APIを定義します。Workerは非同期API(FileReader オブジェクト)および同期API(FileReaderSync オブジェクト)を利用できます。

6.5.1. FileReaderSync API

このインターフェイスは同期的に読み込みを行い、 FileBlob オブジェクトをメモリに読み込みます。

[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) メソッドは呼び出されると、以下のステップを実行しなければなりません:

  1. streamblob に対して get stream で取得する。

  2. readerstream から reader取得 で取得する。

  3. promisestreamreader全バイトの読み出し結果とする。

  4. promise がfulfilledまたはrejectedになるまで待つ。

  5. promiseバイト列 bytes でfulfilledされた場合:

    1. bytesTextblobtypeencodingパッケージデータ に渡した結果を返す。

  6. promise の rejection理由をthrowする。

6.5.1.3. readAsDataURL() メソッド

readAsDataURL(blob) メソッドは呼び出されると、以下のステップを実行しなければなりません:

  1. streamblob に対して get stream で取得する。

  2. readerstream から reader取得 で取得する。

  3. promisestreamreader全バイトの読み出し結果とする。

  4. promise がfulfilledまたはrejectedになるまで待つ。

  5. promiseバイト列 bytes でfulfilledされた場合:

    1. bytesDataURLblobtypeパッケージデータ に渡した結果を返す。

  6. promise の rejection理由をthrowする。

6.5.1.4. readAsArrayBuffer() メソッド

readAsArrayBuffer(blob) メソッドは呼び出されると、以下のステップを実行しなければなりません:

  1. streamblob に対して get stream で取得する。

  2. readerstream から reader取得 で取得する。

  3. promisestreamreader全バイトの読み出し結果とする。

  4. promise がfulfilledまたはrejectedになるまで待つ。

  5. promiseバイト列 bytes でfulfilledされた場合:

    1. bytesArrayBufferblobtypeパッケージデータ に渡した結果を返す。

  6. promise の rejection理由をthrowする。

6.5.1.5. readAsBinaryString() メソッド

readAsBinaryString(blob) メソッドは呼び出されると、以下のステップを実行しなければなりません:

  1. streamblob に対して get stream で取得する。

  2. readerstream から reader取得 で取得する。

  3. promisestreamreader全バイトの読み出し結果とする。

  4. promise がfulfilledまたはrejectedになるまで待つ。

  5. promiseバイト列 bytes でfulfilledされた場合:

    1. bytesBinaryStringblobtypeパッケージデータ に渡した結果を返す。

  6. promise の rejection理由をthrowする。

注: readAsArrayBuffer() の利用が readAsBinaryString() より推奨されます。 readAsBinaryString() は後方互換のために提供されています。

7. エラーと例外

ファイル読み込みエラーは、基盤となるファイルシステムからファイルを読み込む際に発生する場合があります。 以下に示す潜在的エラー条件のリストは参考情報です。

7.1. 例外のスローまたはエラーの返却

この節は規定事項です。

FileBlob の読み込み時にはエラー条件が発生する場合があります。

読み込み操作は、FileBlob の読み込み時のエラー条件によって終了する場合があります。 特定のエラー条件が get stream アルゴリズムの失敗を引き起こす場合、その条件は 失敗理由 と呼ばれます。失敗理由 には、NotFoundUnsafeFileTooManyReadsSnapshotStateFileLock のいずれかがあります。

同期読み込みメソッドは、下記表に記載された型の例外をthrowします。これは特定の失敗理由によるエラーが発生した場合です。

非同期読み込みメソッドは、error 属性(FileReader オブジェクト)を使用し、 特定の失敗理由によるエラーが発生した場合は、下記表で最も適切な型の DOMException オブジェクトを返し、 それ以外の場合は null を返します。

説明および失敗理由
NotFoundError File または Blob リソースが読み込み時に見つからない場合、 これは NotFound 失敗理由です。

非同期読み込みメソッドの場合、error 属性は NotFoundError 例外を返し、 同期読み込みメソッドは throwNotFoundError 例外を投げます。

SecurityError 以下の場合:
  • 一部ファイルがWebアプリケーションでアクセスするには安全でないと判断された場合、 これは UnsafeFile 失敗理由です。

  • File または Blob リソースで過剰な読み込み呼び出しがされたと判断された場合、これは TooManyReads 失敗理由です。

非同期読み込みメソッドの場合、error 属性は SecurityError 例外を返す場合があり、 同期読み込みメソッドは throwSecurityError 例外を投げる場合があります。

他の失敗理由でカバーされていない状況で発生するセキュリティエラーです。

NotReadableError 以下の場合:

非同期読み込みメソッドの場合、error 属性は NotReadableError 例外を返し、 同期読み込みメソッドは throwNotReadableError 例外を投げます。

8. BlobおよびMediaSource参照用のURL

この節では、Blob および MediaSource オブジェクトを参照するためのスキーム付きURLを定義します。

8.1. 概要

この節は参考情報です。

Blob(またはオブジェクト)URLblob:http://example.com/550e8400-e29b-41d4-a716-446655440000 などのURLです。 これにより、BlobMediaSource を URLのみ対応のAPI(例:img要素)と統合できます。Blob URLはローカル生成データのナビゲートやダウンロードのトリガーにも利用できます。

この目的のため URL インターフェイスに2つの静的メソッド createObjectURL(obj)revokeObjectURL(url) が公開されています。 最初のメソッドは URLBlob のマッピングを作成し、 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文字列です。

blobオブジェクト取得blob URLエントリ blobUrlEntry環境設定オブジェクトまたは文字列 "navigation" environment が与えられた場合、以下の手順を実行します。返り値は オブジェクトです。
  1. isAuthorized を true にする。

  2. environment が文字列 "navigation" でなければ、 isAuthorized同じパーティションでのblob URL利用確認の結果にする。

  3. isAuthorized が false なら、失敗を返す。

  4. blobUrlEntryオブジェクトを返す。

新しいblob URL生成: 以下の手順を実行します:
  1. result を空文字列にする。

  2. 文字列 "blob:" を result に追加する。

  3. settings現在の設定オブジェクトとする。

  4. originsettingsオリジンとする。

  5. serializedoriginASCIIシリアライズ結果とする。

  6. serialized が "null" なら、実装定義の値に設定する。

  7. serializedresult に追加する。

  8. U+0024 SOLIDUS (/) を result に追加する。

  9. UUID [RFC4122] を文字列として生成し、result に追加する。

  10. result を返す。

このアルゴリズムで生成できるblob URLの例: blob:https://example.org/40a5fb5a-d56d-4a33-b4e2-0acf6a8e5f64
blob URLストアにエントリ追加objectが与えられたとき、以下の手順を実行します:
  1. store をユーザーエージェントの blob URLストアとする。

  2. url新しいblob URL生成の結果とする。

  3. entryobject および 現在の設定オブジェクトからなる新しいblob URLエントリとする。

  4. store[url] = entry を設定する。

  5. url を返す。

blob URLストアからエントリ削除urlが与えられたとき、以下の手順を実行します:
  1. store をユーザーエージェントの blob URLストアとする;

  2. url stringurlのシリアライズ結果とする。

  3. store[url string]を削除する。

8.3. blob URLのデリファレンスモデル

blob URL解決URL url が与えられたとき:
  1. アサートurlスキームは "blob" であること。

  2. store をユーザーエージェントの blob URLストアとする。

  3. url stringurlのシリアライズフラグメント除外フラグをセット)結果とする。

  4. もし 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のナビゲーションにはこの制限はありません。

同じパーティションでのblob URL利用確認blob URLエントリ blobUrlEntry環境設定オブジェクト environment が与えられたとき、以下の手順を実行します。返り値はbooleanです。
  1. blobStorageKey非ストレージ用途のストレージキー取得blobUrlEntry環境を渡して得る。

  2. environmentStorageKey非ストレージ用途のストレージキー取得environmentを渡して得る。

  3. blobStorageKeyequalenvironmentStorageKey でないなら false を返す。

  4. true を返す。

8.3.3. blob URLのライフタイム

この仕様は ドキュメントアンロード時のクリーンアップ手順を以下の手順で拡張します:

  1. environmentDocument関連設定オブジェクトとする。

  2. store をユーザーエージェントの blob URLストアとする。

  3. store から 環境environment と等しい全てのエントリを削除する。

Workerのアンロード時にも同様のフックが必要です。

8.4. blob URLの生成と破棄

Blob URLURLオブジェクト上の静的メソッドで生成・破棄されます。 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) 静的メソッドは objblob URLストアへのエントリ追加結果を返さなければなりません。
revokeObjectURL(url) 静的メソッドは以下の手順を実行しなければなりません:
  1. urlRecordurlのパース結果とする。

  2. urlRecordスキームが"blob"でなければreturn。

  3. entryurlRecordblob URLエントリとする。

  4. entryがnullならreturn。

  5. isAuthorized同じパーティションでのblob URL利用確認entry現在の設定オブジェクトを渡した結果とする。

  6. isAuthorizedがfalseならreturn。

  7. blob URLストアからエントリ削除urlに対して実行する。

注: 登録されていないURLや他のストレージパーティションの環境から登録されたURLの破棄を試みても、エラーは投げずに黙って失敗します。 この場合、ユーザーエージェントがエラーコンソールにメッセージを表示することがあります。

注: 破棄後にurlをデリファレンスしようとすると ネットワークエラーになります。 破棄前に開始されたリクエストは成功すべきです。

下記例ではwindow1window2は別ですが、 同一オリジンです。window2iframeとしてwindow1内に存在し得ます。
myurl = window1.URL.createObjectURL(myblob);
window2.URL.revokeObjectURL(myurl);

ユーザーエージェントはグローバルなblob URLストアを持つため、 生成元とは異なるwindowからオブジェクトURLを破棄することが可能です。 URL.revokeObjectURL() の呼び出しにより、以降のmyurlデリファレンスは ネットワークエラー発生扱いとなります。

8.4.1. blob URL生成と破棄の例

Blob URLfetchBlobオブジェクトを取得するための文字列であり、 documentが存続する限り URL.createObjectURL()で生成したURLは有効です。 § 8.3.3 blob URLのライフタイム参照。

この節ではblob URLの生成・破棄の使用例を説明します。

下記例では2つの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はすべてのユースケースを満たすものではなく、 今後のバージョンで追加対応する場合があります。

謝辞

本仕様は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リスト参加者にも感謝します。

適合性

文書の規約

適合性の要件は、記述的な断定とRFC 2119の用語を組み合わせて表現されます。 規範的な部分における “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” というキーワードは、RFC 2119 で説明されている通りに解釈されます。 ただし、可読性のため、本仕様ではこれらの語はすべて大文字では記載されていません。

この仕様書のすべてのテキストは、明示的に非規範的と記載された節、例、注釈を除き、規範的です。[RFC2119]

本仕様の例は「例えば」で始まるか、class="example"で規範的なテキストから区別されています。 例えば、以下のようになります:

これは参考例の一つです。

参考となる注記は「Note」から始まり、class="note"で規範的なテキストから区別されています。 以下のようになります:

Note: これは参考情報の注記です。

適合するアルゴリズム

アルゴリズム内で命令形で記述された要件(例:「先頭の空白文字を除去する」「偽を返してこれらの手順を中止する」など)は、アルゴリズムを導入する際に使われているキーワード("must", "should", "may"など)の意味に従って解釈されます。

アルゴリズムや具体的な手順として記述された適合性要件は、最終的な結果が同等であれば、どのような方法でも実装できます。 特に、本仕様で定義されるアルゴリズムは理解しやすくするためのものであり、性能を意図したものではありません。 実装者は最適化を推奨します。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding Standard. 現行標準. URL: https://encoding.spec.whatwg.org/
[Fetch]
Anne van Kesteren. Fetch Standard. 現行標準. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[MEDIA-SOURCE-2]
Jean-Yves Avenard; Mark Watson. Media Source Extensions™. 2024年7月4日. WD. URL: https://www.w3.org/TR/media-source-2/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC2397]
L. Masinter. The "data" URL scheme. 1998年8月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2397
[RFC4122]
K. Davis; B. Peabody; P. Leach. Universally Unique IDentifiers (UUIDs). 2024年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9562
[SERVICE-WORKERS]
Jake Archibald; Marijn Kruisselbrink. Service Workers. 2022年7月12日. CR. URL: https://www.w3.org/TR/service-workers/
[STORAGE]
Anne van Kesteren. Storage Standard. 現行標準. URL: https://storage.spec.whatwg.org/
[STREAMS]
Adam Rice; et al. Streams Standard. 現行標準. URL: https://streams.spec.whatwg.org/
[URL]
Anne van Kesteren. URL Standard. 現行標準. URL: https://url.spec.whatwg.org/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/
[XHR]
Anne van Kesteren. XMLHttpRequest Standard. 現行標準. URL: https://xhr.spec.whatwg.org/

参考情報文献

[Workers]
Ian Hickson. Web Workers. 2021年1月28日. NOTE. URL: https://www.w3.org/TR/workers/

IDL索引

[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 chunks
  Blob slice(optional [Clamp] long long start,
            optional [Clamp] long long end,
            optional DOMString contentType);

  // read from the Blob.
  [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;

[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;
};

[Exposed=(Window,Worker), Serializable]
interface FileList {
  getter File? item(unsigned long index);
  readonly attribute unsigned long length;
};

[Exposed=(Window,Worker)]
interface FileReader: EventTarget {
  constructor();
  // async read methods
  undefined readAsArrayBuffer(Blob blob);
  undefined readAsBinaryString(Blob blob);
  undefined readAsText(Blob blob, optional DOMString encoding);
  undefined readAsDataURL(Blob blob);

  undefined abort();

  // states
  const unsigned short EMPTY = 0;
  const unsigned short LOADING = 1;
  const unsigned short DONE = 2;

  readonly attribute unsigned short readyState;

  // File or Blob data
  readonly attribute (DOMString or ArrayBuffer)? result;

  readonly attribute DOMException? error;

  // event handler content attributes
  attribute EventHandler onloadstart;
  attribute EventHandler onprogress;
  attribute EventHandler onload;
  attribute EventHandler onabort;
  attribute EventHandler onerror;
  attribute EventHandler onloadend;
};

[Exposed=(DedicatedWorker,SharedWorker)]
interface FileReaderSync {
  constructor();
  // Synchronously return strings

  ArrayBuffer readAsArrayBuffer(Blob blob);
  DOMString readAsBinaryString(Blob blob);
  DOMString readAsText(Blob blob, optional DOMString encoding);
  DOMString readAsDataURL(Blob blob);
};

[Exposed=(Window,DedicatedWorker,SharedWorker)]
partial interface URL {
  static DOMString createObjectURL((Blob or MediaSource) obj);
  static undefined revokeObjectURL(DOMString url);
};

課題索引

Blobからの読み込みが実際に何を行うか、どんなエラーが発生し得るか、チャンクサイズなどについて、もっと具体的に規定する必要があります。
loadstartをXMLHttpRequestの挙動に合わせて、同期的にdispatchするよう変更する可能性があります。[Issue #119]
DataURLの生成方法をより明確に規定するべきです。[Issue #104]
Workerのアンロード時にも同様のフックが必要です。
この節は暫定的なものであり、今後の草案でより多くのセキュリティ情報が補足される可能性があります。
MDN

Blob/Blob

In all current engines.

Firefox13+Safari6+Chrome20+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
Node.js15.7.0+
MDN

Blob/arrayBuffer

In all current engines.

Firefox69+Safari14+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.7.0+
MDN

Blob/size

In all current engines.

Firefox4+Safari6+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
Node.js15.7.0+
MDN

Blob/slice

In all current engines.

Firefox13+Safari7+Chrome21+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12+
Node.js15.7.0+
MDN

Blob/stream

In all current engines.

Firefox69+Safari14.1+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.7.0+
MDN

Blob/text

In all current engines.

Firefox69+Safari14+Chrome76+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js15.7.0+
MDN

Blob/type

In all current engines.

Firefox4+Safari6+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
Node.js15.7.0+

File/type

In all current engines.

Firefox3.6+Safari8+Chrome13+
Opera15+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

Blob

In all current engines.

Firefox4+Safari6+Chrome5+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile11+
Node.js18.0.0+
MDN

File/File

In all current engines.

Firefox28+Safari10.1+Chrome38+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

File/lastModified

In all current engines.

Firefox15+Safari10+Chrome13+
Opera15+Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

File/name

In all current engines.

Firefox3.6+Safari8+Chrome13+
Opera15+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile14+
MDN

File

In all current engines.

Firefox7+Safari4+Chrome13+
Opera11.5+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11.5+
MDN

FileList/item

In all current engines.

Firefox3+Safari4+Chrome2+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile12.1+
MDN

FileList/length

In all current engines.

Firefox3+Safari4+Chrome2+
Opera11.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11.1+
MDN

FileList

In all current engines.

Firefox3+Safari4+Chrome2+
Opera11.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile11.1+
MDN

FileReader/FileReader

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12.1+
MDN

FileReader/abort

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/abort_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/abort_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/error

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/error_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/error_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/load_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/load_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/loadend_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/loadend_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/loadstart_event

In all current engines.

Firefox79+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android79+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/loadstart_event

In all current engines.

Firefox79+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android79+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/progress_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/progress_event

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/readAsArrayBuffer

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile12+
MDN

FileReader/readAsBinaryString

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IENone
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/readAsDataURL

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/readAsText

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/readyState

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader/result

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReader

In all current engines.

Firefox3.6+Safari6+Chrome6+
Opera11+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android32+iOS Safari?Chrome for Android?Android WebView3+Samsung Internet?Opera Mobile11+
MDN

FileReaderSync/FileReaderSync

In all current engines.

Firefox8+Safari6+Chrome7+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

FileReaderSync/readAsArrayBuffer

In all current engines.

Firefox8+Safari6+Chrome9+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

FileReaderSync/readAsDataURL

In all current engines.

Firefox8+Safari6+Chrome7+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

FileReaderSync/readAsText

In all current engines.

Firefox8+Safari6+Chrome7+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

FileReaderSync

In all current engines.

Firefox8+Safari6+Chrome7+
Opera12.1+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile12.1+
MDN

URL/createObjectURL_static

In all current engines.

Firefox19+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.7.0+
MDN

URL/revokeObjectURL_static

In all current engines.

Firefox19+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js16.7.0+