Firefox web browser - Faster, more secure & customizable |
W3C FileAPI in Firefox 3.6において、Firefox 3.6で新しくサポートが追加されるW3C File APIの利用例が紹介されている。W3C File APIは特にXMLHttpRequestと組み合わせての利用を想定して策定されているファイルアクセス用のインタフェースとAPI。非同期でのファイルの読み込みやイベント処理を規程している。現在のところワーキングドラフトの段階で、インタフェース、API、イベントモデルなどが定義されている。W3C File APIから特にポイントとなるインタフェース、メソッド、イベント、属性を次に掲載する。
インタフェース | 内容 | 属性 |
---|---|---|
FileReaderインタフェース | ファイルの読み込み操作を提供 | readyState, result, error |
Fileインタフェース | ファイルの名前や種類、URNを表現 | name, type, urn |
Blobインタフェース | 実際のデータのまとまりを表現 | size |
FileListシーケンス | 選択されたファイルのリストを表現 |
FileReaderで使われるイベント | 内容 |
---|---|
onloadstart | 読み込み開始時 |
onprogress | 読み込み中 |
onload | 読み込みが完了したとき |
onabort | 読み込みが中断されたとき |
onerror | 読み込みに失敗したとき |
onloadend | リクエストが完了したとき |
メソッド | 内容 |
---|---|
FileReader#readAsBinaryString(Blob) | バイナリ文字列としてデータを読み込み |
FileReader#readAsText(Blob) | テキストとしてデータを読み込み |
FileReader#readAsDataURL(File) | Data URLとしてデータを読み込み |
Blob#slice(start,length) | 指定された領域のデータを表現するBlobを返す |
Firefoxでは3.6でW3C File APIの多くの機能をサポートする。Firefoxは3.0の段階でファイルをメモリへ読み込ませる機能を提供しているが、これは同期処理になるほか、3.6以降はW3C File APIを推奨し、こちらは非推奨になる見通し。W3C File APIを使うことで非同期にファイルをメモリを読み込ませることができるようになる。
Firefox 3.6ではW3C File APIで規程されているFileListを活用する形で、複数ファイルの選択にも対応。inputタグの指定で「multiple="true"」を指定することで可能。指定がなければ従来どおり単一ファイルの選択のみとなる。サーバにデータを送信する前にデータをメモリ読み込ませJavaScriptで処理できるようになる。クライアントのみでデータを処理して利用することも、メモリで読み込ませたデータをサーバに送信して活用することも可能。
W3C FileAPI in Firefox 3.6で紹介されている機能のいくつかをそのまま利用できるようにしたHTMLと実行例を次に掲載しておく。実行するにはFirefox 3.6 beta4など3.6系のFirefoxが必要。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Firefox 3.6 W3C File APIデモンストレーション</title>
<style type="text/css">
body {
width: 600px;
}
#area_fileselection {
background: #eee;
border: 1px solid #333;
margin: 10px 10px 10px 10px;
padding: 10px 10px 10px 10px;
}
#area_fileinformation {
background: #efefef;
border: 1px solid #333;
margin: 10px 10px 10px 10px;
padding: 0px 10px 0px 10px;
min-height: 300px;
}
fieldset.inputbox {
text-align: center;
}
fieldset.inputbox label,input {
margin: 20px 0px 20px 0px;
}
</style>
<script type="text/javascript">
//<![CDATA[
var inputfile, inputfiles, fileinfotext;
function init()
{
inputfile = document.getElementById("inputfile").files;
inputfiles = document.getElementById("inputfiles").files;
fileinfotext = document.getElementById("fileinfotext");
var submit = document.getElementById("submit");
submit.addEventListener("click", printFilesList, true);
}
function printFilesList()
{
var buffer = "";
var addmessage = function(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
buffer += "ファイル名: " + file.name + "<br />";
buffer += "タイプ: " + file.type + "<br />";
buffer += "URN: " + file.urn + "<hr />";
}
}
addmessage(inputfile);
addmessage(inputfiles);
fileinfotext.innerHTML = buffer;
}
window.addEventListener("load", init, true);
//]]>
</script>
</head>
<body>
<div id="area_fileselection">
<form>
<fieldset class="inputbox">
<legend>W3C File APIデモンストレーション (Firefox 3.6)</legend>
<label for="inputfile">シングルファイルセレクタ</label>
<input id="inputfile" type="file" /><br />
<label for="inputfiles"> マルチファイルセレクタ </label>
<input id="inputfiles" type="file" multiple="true" />
<input id="submit" type="button" value="選択されたファイルのチェック" />
</fieldset>
</form>
</div>
<div id="area_fileinformation">
<p id="fileinfotext"></p>
</div>
</body>
</html>
エクステンションやプラグインを使うことなく複数のファイルを選択する機能が登場するのは便利だ。またこの機能はドラッグ&ドロップとも連携が可能で、OSのファイルマネージャで複数選択したファイルをそのままドラッグ&ドロップで流し込んで同じように処理することもできる。