ファイル API

W3C 作業草案、

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-FileAPI-20260912/
最新公開バージョン:
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() メソッドの File や Blob 引数のオーバーロード)、postMessage()、 DataTransfer ([HTML]で定義されているドラッグ&ドロップAPIの一部)やWeb Workersと組み合わせて利用されることを想定しています。 また、input 要素が ファイルアップロード 状態のときに、プログラムでファイル一覧を取得できる必要があります [HTML]。 これらの振る舞いは、関連する仕様で定義されています。

この文書のステータス

この節は、公開時点における本書のステータスを説明するものです。現在の W3C の出版物一覧および本技術レポートの最新版は、W3C 標準および草案の索引にあります。

本書は Web Applications Working Group により 作業草案(Working Draft) として、勧告トラック に基づき公開されました。 作業草案としての公開は、W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、 いつでも更新、置換、 あるいは他の文書により廃止される可能性があります。 進行中の作業以外のものとして本書を引用するのは不適切です。

この仕様に関する過去の議論は、他の2つのメーリングリストで行われました: public-webapps@w3.org(アーカイブ)および public-webapi@w3.org(アーカイブ)。継続的な議論は public-webapps@w3.org メーリングリストで行われます。

この草案は、以前の Last Call Working Draft に対して行われた変更から成ります。上記のとおり、コメントは public-webapi@w3.org にお送りください。W3C Wiki 上の Last Call へのフィードバックは次をご覧ください: https://www.w3.org/wiki/Webapps/LCWD-FileAPI-20130912

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

本書は、W3C 特許ポリシーの下で運営されるグループにより作成されました。W3C は、グループの成果物に関連して行われた特許開示の公開リストを管理しています;このページには特許開示の手順も含まれています。ある個人が、Essential Claim(s) を含むとその個人が信じる特許について実際の知識を有する場合には、W3C 特許ポリシーの第6節に従って情報を開示しなければなりません。

本書は 2025年8月18日版 W3C プロセス文書 に準拠しています。

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() の呼び出しで終了することができます。

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

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

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

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

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

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

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

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

  5. span を max((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;

  // 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] 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が与えられた場合、次の通りです:

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

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

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

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

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

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

  2. セットアップ stream をバイト読み取り対応で行う。

  3. 以下の手順を並列に実行する:

    1. blob のすべてのバイトが読み取られていない間:

      1. bytes を、blob から得られるバイト列、すなわちチャンクを 1 つ読み取った結果とし、チャンクを読み取れない場合は 失敗とする。

      2. グローバルタスクをキューに入れ、ファイル読み取りタスクソース上で、 blob の 関連するグローバルオブジェクトを指定して、 以下の手順を実行する:

        1. bytes が失敗である場合、stream をエラーにする。このとき、 失敗理由をエラーの値として用い、その後、 これらの手順を中止する。

        2. chunk を、新しい Uint8Array とし、bytes を含む ArrayBuffer をラップする。もし ArrayBuffer の作成が例外をスローした場合、その例外で stream をエラーにし、 これらの手順を中止する。

        3. chunk をエンキューして、 stream に入れる。

      Blob からの読み取りが実際に何を行うのか、どのようなエラーが発生し得るのか、 おそらくチャンクサイズなどについても、より具体的に仕様化する必要がある。

  4. stream を返す。

3.1. コンストラクター

Blob() コンストラクターは、0 個以上の引数を指定して呼び出すことができる。 Blob() コンストラクターが呼び出されたとき、 ユーザーエージェントは、以下の手順を実行しなければならない:
  1. 0 個の引数で呼び出された場合、 0 バイトで構成され、 size が 0 に設定され、 type が空文字列に設定された、新しい Blob オブジェクトを返す。

  2. bytes を、blobParts および options を指定してblob 部分を処理した結果とする。

  3. options 引数の type メンバーが空文字列でない場合、 以下の下位手順を実行する:

    1. t を type 辞書メンバーとする。 t に U+0020 から U+007E の範囲外の文字が含まれている場合、 t を空文字列に設定し、これらの下位手順から戻る。

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

  4. bytes を関連付けられたバイト列として参照し、 size が bytes の長さに設定され、 type が上記の下位手順の t の値に設定された Blob オブジェクトを返す。

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

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

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

  2. parts の各 element について:

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

      1. s を element とする。

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

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

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

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

    3. element が Blob の場合、 そのバイト列を 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. position を s の位置変数とし、初期値は s の先頭。

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

  6. token を result に追加。

  7. position が s の末尾を超えていない間:

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

      1. native line ending を result に追加。

      2. position を1進める。

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

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

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

    4. token を result に追加。

  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 列のバイト数を返します。 取得時、準拠するユーザーエージェントは 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 オブジェクトを返します。動作は次の通りです:
  1. sliceStart、sliceEnd、sliceContentType を null にする。

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

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

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

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

3.3.3. text() メソッド

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

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

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

  3. promise を 全バイト読み出しで stream と reader で取得する。

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

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

3.3.4. arrayBuffer() メソッド

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

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

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

  3. promise を 全バイト読み出しで stream と reader で取得する。

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

3.3.5. bytes() メソッド

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

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

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

  3. promise を 全バイト読み出しで stream と reader で取得する。

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

3.3.6. textStream() メソッド

textStream() メソッドの手順は次のとおりです:

  1. stream を、get stream を this に対して呼び出した結果とする。

  2. decoder を、this の 関連レルム内の新しい TextDecoderStream とする。

  3. decoder を UTF-8 で設定する。

  4. stream を decoder にpipe through した結果を返す。

注: これは readAsText() とは異なり、常に UTF-8 エンコーディングを使用する。

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

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

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

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

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

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

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

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

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

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

4.1. コンストラクター

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

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

    注: 基盤となる OS のファイルシステムでは、 ファイル名について異なる規則が使用される。 構築されたファイルでは、UTF-16 を必須とすることで、ファイル名がバイト 列に変換される際の曖昧さが軽減される。

  3. FilePropertyBag 辞書引数を、以下の下位手順を実行して処理する:

    1. type メンバーが指定され、かつ空文字列でない場合、 t を type 辞書メンバーに設定する。 t に U+0020 から U+007E の範囲外の文字が含まれている場合、 t を空文字列に設定し、これらの下位手順から戻る。

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

    3. lastModified メンバーが指定されている場合、 d を lastModified 辞書メンバーに設定する。 指定されていない場合、 d を、Unix エポックからのミリ秒数として表される 現在の日付と時刻に設定する (これは Date.now() [ECMA-262] と同等である)。

      注: ECMA-262 の Date オブジェクトは、Unix エポックからのミリ秒数を表す long long 値に変換されるため、 lastModified メンバーは Date オブジェクトであってもよい [ECMA-262]。

  4. 以下を満たす新しい File オブジェクト F を返す:

    1. F は bytes のバイト列を参照する。

    2. F.size を bytes 内の総バイト数に設定する。

    3. F.name を n に設定する。

    4. F.type を t に設定する。

    5. F.lastModified を d に設定する。

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

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

fileBits sequence
以下の要素を任意の数・順序で受け取ります:
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.now() [ECMA-262] と同等である。 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.item(0)のような構文はリスクがありますが、 他のほとんどの FileList のプログラム的利用は、 最終的に Array型へ移行しても影響を受ける可能性は低いです。

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

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

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

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

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

デシリアライズ手順は serialized と value が与えられた場合:

  1. 各 file を serialized.[[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 は、ユーザーエージェントによって 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 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;
};

FileReader には 状態("empty"、"loading"、"done")があり、初期値は "empty" です。

FileReader には 結果(null、DOMString、ArrayBuffer)があり、初期値は null です。

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

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

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

"empty"

EMPTY を返す

"loading"

LOADING を返す

"done"

DONE を返す

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

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

FileReader fr には、関連付けられた read operation アルゴリズムがあり、 これは blob、type、および省略可能な encodingLabel が与えられたときに、 次の手順を実行する:
  1. もし fr の state が "loading" なら、 InvalidStateError DOMException を投げる。

  2. fr の state を "loading" に設定する。

  3. fr の result を null に設定する。

  4. fr の error を null に設定する。

  5. stream を、blob に対して get stream を呼び出した結果とする。

  6. reader を、stream から getting a reader を行った結果とする。

  7. bytes を空の byte sequence とする。

  8. chunkPromise を、reader を用いて stream から reading a chunk を行った結果とする。

  9. isFirstChunk を true とする。

  10. In parallel に、true の間次を行う:

    1. chunkPromise が fulfilled または rejected になるまで待つ。

    2. もし chunkPromise が fulfilled で、かつ isFirstChunk が true なら、 queue a task をして、fire a progress event と呼ばれる loadstart を fr に対して発火する。

      我々は loadstart を同期的にディスパッチするよう変更する可能性がある。 これは XMLHttpRequest の挙動に合わせるためである。 [Issue #119]

    3. isFirstChunk を false に設定する。

    4. もし chunkPromise が、done プロパティが false で、value プロパティが Uint8Array オブジェクトであるオブジェクトで fulfilled されたなら、次の手順を実行する:

      1. bs を、その Uint8Array オブジェクトで表される byte sequence とする。

      2. bs を bytes に追加する。

      3. おおよそ 50ms が直前にこれらの手順が呼び出されてから経過している場合、 queue a task をして、fire a progress event と呼ばれる progress を fr に対して発火する。

      4. chunkPromise を、reader を用いて stream から reading a chunk を行った結果に設定する。

    5. それ以外の場合、もし chunkPromise が done プロパティが true のオブジェクトで fulfilled されたなら、 次の手順を実行するために queue a task をし、このアルゴリズムを中止する:

      1. fr の state を "done" に設定する。

      2. result を、 package data の結果(引数は bytes、 type、blob の type、 および encodingLabel)とする。

      3. もし package data が例外 error を投げたなら:

        1. fr の error を error に設定する。

        2. Fire a progress event と呼ばれる error を fr に対して発火する。

      4. それ以外の場合:

        1. fr の result を result に設定する。

        2. Fire a progress event と呼ばれる load を fr に対して発火する。

      5. もし fr の state が "loading" でないなら、 fire a progress event と呼ばれる loadend を fr に対して発火する。

        Note: load または error イベントのイベントハンドラーが別の読み込みを開始している可能性がある。 その場合、この読み込みに対する loadend イベントは発火されない。

    6. それ以外の場合、もし chunkPromise がエラー error で rejected されたなら、 次の手順を実行するために queue a task をし、このアルゴリズムを中止する:

      1. fr の state を "done" に設定する。

      2. fr の error を error に設定する。

      3. Fire a progress event と呼ばれる error を fr に対して発火する。

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

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

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

  3. タスク が、this からのものとして、 関連付けられた タスクキュー 内の ファイル読み取りタスクソース 上に存在する場合、 それらの タスク をそのタスクキューから削除する。

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

  5. 進行イベントを 発火する。これは abort と呼ばれ、this で発火される。

  6. 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
  1. encoding を失敗とする。

  2. encodingLabel が存在する場合は、encoding を encodingLabel からエンコーディングを取得した結果に設定する 。

  3. encoding が失敗の場合:

    1. type を、 mimeType を与えてMIME タイプを構文解析する結果とする 。

    2. type が失敗でない場合は、 encoding を、type のパラメーター["charset"] からエンコーディングを取得した 結果に設定する。

      blob に type 属性として text/plain;charset=utf-8 がある場合、ラベルとして "utf-8" を使用してエンコーディングを取得する処理が実行される 。 ユーザーエージェントは、エンコーディングのラベルを構成する Charset パラメーター の部分を構文解析して抽出しなければならないことに注意すること。
  4. encoding が失敗の場合は、encoding を UTF-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 は読み取りの完了時に発火するが、 以下のいずれかが真である場合を除く:

    • 読み取りメソッドが abort() を使用してキャンセルされ、新しい読み取り メソッドが呼び出された場合

    • 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 イベントは発火してはならない
    
  2. blob が完全にメモリへ読み込まれたとき、1 つの progress イベントが発火する。

  3. loadstart より前に progress イベントが発火することはない。

  4. abort、load、 および error のいずれかが発火した後に progress イベントが発火することはない。 特定の読み取りについて、abort、load、 および error のうち発火するのは最大でも 1 つである。

  5. loadend の後に abort、load、 または error イベントが発火することはない。

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

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

  2. reader を stream から reader取得 で取得する。

  3. promise を stream と reader で 全バイトの読み出し結果とする。

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

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

    1. bytes、Text、blobの type、encoding を パッケージデータ に渡した結果を返す。

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

6.5.1.3. readAsDataURL() メソッド

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

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

  2. reader を stream から reader取得 で取得する。

  3. promise を stream と reader で 全バイトの読み出し結果とする。

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

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

    1. bytes、DataURL、blobの type を パッケージデータ に渡した結果を返す。

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

6.5.1.4. readAsArrayBuffer() メソッド

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

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

  2. reader を stream から reader取得 で取得する。

  3. promise を stream と reader で 全バイトの読み出し結果とする。

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

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

    1. bytes、ArrayBuffer、blobの type を パッケージデータ に渡した結果を返す。

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

6.5.1.5. readAsBinaryString() メソッド

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

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

  2. reader を stream から reader取得 で取得する。

  3. promise を stream と reader で 全バイトの読み出し結果とする。

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

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

    1. bytes、BinaryString、blobの type を パッケージデータ に渡した結果を返す。

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

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

7. エラーと例外

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

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

この節は規定事項です。

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

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

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

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

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

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

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

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

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

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

NotReadableError 以下の場合:

非同期読み込みメソッドの場合、error 属性は NotReadableError 例外を返し、 同期読み込みメソッドは throw で 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 文字列であるパスを持つ。

blob オブジェクトを取得するには、blob URL エントリ blobUrlEntry と、環境、"top-level-navigation"、または "top-level-self-fetch" である environment が与えられた場合、次の手順を実行する。これらは オブジェクトを返す。
  1. isAuthorized を true とする。

  2. environment が 環境である場合、isAuthorized を blobUrlEntry と environment を用いて同一パーティションの blob URL 使用をチェックした結果に設定する。

  3. isAuthorized が false の場合、失敗を返す。

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

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

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

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

  4. origin を settings の オリジンとする。

  5. serialized を origin の ASCIIシリアライズ結果とする。

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

  7. serialized を result に追加する。

  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. entry を object および 現在の設定オブジェクトからなる新しいblob URLエントリとする。

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

  5. url を返す。

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

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

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

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

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

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

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

  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 エントリ blobUrlEntry と 環境 environment が与えられた場合に、同一パーティションでの blob URL の使用をチェックするには、次の手順を実行する。これらは 真偽値を返す。
  1. blobStorageKey を、blobUrlEntry の 環境を用いて非ストレージ目的のストレージキーを 取得した結果とする。

  2. environmentStorageKey を、environment を用いて非ストレージ目的のストレージキーを 取得した結果とする。

  3. blobStorageKey が environmentStorageKey と等しくない場合、false を返す。

  4. true を返す。

8.3.3. blob URLのライフタイム

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

  1. environment を Document の 関連設定オブジェクトとする。

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

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

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

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) 静的メソッドは以下の手順を実行しなければなりません:
  1. urlRecord を urlのパース結果とする。

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

  3. entry を urlRecord の blob URLエントリとする。

  4. entryがnullならreturn。

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

  6. isAuthorizedがfalseならreturn。

  7. 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.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 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. エンコーディング標準. 現行 標準. URL: https://encoding.spec.whatwg.org/
[Fetch]
Anne van Kesteren. Fetch 標準. 現行 標準. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; ほか. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[MEDIA-SOURCE-2]
Jean-Yves Avenard; Mark Watson. メディアソース 拡張™. 2026年8月7日. WD. URL: https://www.w3.org/TR/media-source-2/
[MIMESNIFF]
Gordon P. Hemsley. MIME スニッフィング標準. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[RFC2119]
S. Bradner. 要求レベルを示すために RFC で 使用するキーワード. 1997年3月. 現行最良慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC2397]
L. Masinter. 「data」URL スキーム. 1998年8月. 提案標準. URL: https://www.rfc-editor.org/info/rfc2397/
[RFC4122]
K. Davis; B. Peabody; P. Leach. 汎用一意 識別子(UUID). 2024年5月. 提案標準. URL: https://www.rfc-editor.org/info/rfc9562/
[STORAGE]
Anne van Kesteren. ストレージ標準. 現行 標準. URL: https://storage.spec.whatwg.org/
[STREAMS]
Adam Rice; ほか. Streams 標準. 現行 標準. URL: https://streams.spec.whatwg.org/
[URL]
Anne van Kesteren. URL 標準. 現行標準. URL: https://url.spec.whatwg.org/
[WebIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/
[XHR]
Anne van Kesteren. XMLHttpRequest 標準. 現行 標準. 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] ReadableStream textStream();
  [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+