Summary

  • W3Cは2009年11月17日、File APIの最初の公開作業草案を出した。FileListが選択済みのファイルを表し、FileReaderがその内容をイベント付きで読む構想だった。
  • 2013年の最終意見募集段階と2015年の作業草案で、Blob、非同期読み取り、blob URLなどが整理された。ページ内での確認とサーバーへの送信は、同じファイルから始まる別の行為である。

写真店にプリントを頼むなら、店員には写真を一枚渡す。店員が「便利なので」と自宅の書類棚を調べ始めたら、客は写真どころではない。ウェブのファイル選択にも同じ距離感が必要だった。ページは選んだ画像を見たい。だが、そのためにパソコン中のファイルを探し回る権利を求めるわけにはいかない。

2009年11月17日のW3C初公開作業草案は、個々に選ばれたファイルから話を始める。<input type="file">で利用者が選び、FileListがその選択を並べる。Fileには名前や種類があり、Blobは生のバイト列とその一部分を扱う。FileReaderは内容を読み込み、進行状況や完了をイベントで伝える。ページに届くのは、利用者が指さしたものを表すオブジェクトだった。

古いアップロード用フォームでもファイルを送ることはできた。違いは、送る前にページが仕事をできるようになった点にある。2009年草案にはreadAsBinaryString、readAsText、readAsDataURLという非同期読み取り方法が並ぶ。選んだ写真を画面に出す。テキストを開く。内容を見てから送信するか決める。もし別の写真を選んでいたら、サーバーに届けてから慌てる必要がなくなる。

草案の利用例には、歌詞ビューアーが選んだプレイリストを読み、曲を並べ替える場面がある。別の例では、ローカルの予定表ファイルを開いて予定をまとめ、必要なら後で同期する。ファイルは宅配便の荷物だけではない。ページの中で読み、組み合わせ、確かめるための材料にもなる。この発想が「ファイルを選ぶ」という古い操作の役割を広げた。

もちろん、選択の境界は見せかけで済まない。2009年草案の安全性に関する節は、FileReaderで読むファイルを利用者が先に選んだものと想定したうえで、選択画面をしつこく開かせる攻撃、システムの機密ファイル、選択後にディスク上で変わるファイルを挙げている。ローカルファイルはページ内の固定文字列ではない。別のプログラムが書き換えることもあり、ブラウザーが読ませない場合もある。窓口で受け取った封筒が、中身まで永遠に同じとは限らない。

2013年9月12日のLast Call作業草案では、役割分担がさらに明確になった。FileListが選択されたものを持ち、変更できない生データとしてのBlobは切り出しもできる。Fileは名前や更新時刻を加え、FileReaderは非同期で読みながら進行、成功、失敗を知らせる。草案の例は選んだファイルをテキストとして読み、進行表示を更新した。大きなファイルや遅いドライブに出会っても、ページは無言で固まる代わりに状況を伝えられる。

次の難題は、ウェブが何でもURLで扱いたがることだった。手元の写真はオブジェクトなのに、ページの画像要素は参照先を欲しがる。blob URLがその橋になる。2015年4月21日の作業草案はURL.createObjectURL()で参照を作り、プレビューを終えたらURL.revokeObjectURL()で取り消す例を示した。放置した参照が漏れにつながることにも触れている。プレビュー用の番号札を渡したら、用が済んだところで回収するのである。

2015年草案には、地味だが筋の通った規則もある。File.nameが返すのはファイル名で、上位フォルダーの経路ではない。ページが画像の横に「旅行写真.jpg」と表示するために、利用者のフォルダー構成を知る必要はない。blob URLについても、草案は生成元のオリジンに結び付け、別オリジンからの要求を失敗させる。ページが作業できる範囲を、渡されたオブジェクトに合わせて考えている。

W3Cの公開履歴をたどれば、2009年に最初の公開作業草案、2013年にLast Call、2015年にさらに作業草案が出たことが分かる。この時点の文書を完成済みの勧告と呼ぶ必要はない。むしろ、選択済みファイルという小さな受け渡しを何年もかけて使いやすくしていった過程に意味がある。

そして、選んだファイルのバイトをページが受け取った後は、アプリケーションの判断が続く。画面内で加工することも、別の仕組みでサーバーへ送ることもできる。写真がプレビューできたという事実だけでは、送信されたことにはならない。反対に、選択しただけでその後のコピー先が決まったわけでもない。W3Cのインターフェースは最初の受け渡しをはっきりさせ、次の行為の責任をページに残した。

一枚の写真を確認して選び直せる。予定表をページ内で突き合わせられる。読み込みが遅ければ進行状況が見える。どれも派手な新天地ではない。店員が受け取った一枚をきちんと扱えるようになった、という話だ。書類棚の引き出しは、開けた人の側に残る。