File APIでは、ブラウザ上でユーザーがフォームから選択したファイルやユーザーがドラッグ&ドロップしたファイルを扱うことができる。
ファイルが選択されたときに取得する事ができるFileListオブジェクトには、ユーザーが選択したファイルを格納される。
ぞれぞれのファイルはFileオブジェクトとして表現さる。
複数のファイルを選択したときは、ファイルリストのlengthプロパティから取得できる。
FileListオブジェクトのAPI
- FileListのプロパティ
- length: 含まれるファイル数
- FileListのメソッド
- item: 指定されたn番目のFileオブジェクトを返す
BlobオブジェクトのAPI
バイナリデータを扱うためのオブジェクト。
- Blogのプロパティ
- site: Blobオブジェクトのバイト数
- type: Blobオブジェクトのメディアタイプ
- Blogのメソッド
- slice(): 指定したバイトレンジの新しいBlobオブジェクトを返す
- close(): Blobオブジェクトの利用を終了
FileオブジェクトのAPI
FileはBlobを継承する。
- Fileのプロパティ
- name: ファイル名
- lastModifiedDate: ファイルが最終更新日
<input id="files" type="file" name="files[]" multiple> <div id="list"></div>
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); // ファイルが選択されたときに呼ばれる関数 function handleFileSelect(e) { // 選択されたファイル群のFileListオブジェクト var files = e.target.files; // 入れ物 var output = []; // ファイルの属性情報取得 for(var i = 0, f; f = files[i]; i++) { output.push( '<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a' , ') - ', f.size, 'bytes, last modified: ', f.lastModifiedDate.toLocaleDateString(), '</li>' ); } // ファイルの属性情報表示 // joinで要素を連結 document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>'; } // ファイルが選択されたらイベントハンドラhandleFileSelect関数を実行 function change() { var filesInput = document.getElementById('files'); filesInput.addEventListener('change', handleFileSelect, false); } })();
FileReader API
Constructors
Fileオブジェクトを取得したら、FileReaderオブジェクトをインスタンス化して、コンテンツをメモリに読み取ることができます。
<input id="file" type="file"><br> <img id="output">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('load', function() { var dataURL = reader.result; var output = document.getElementById('output'); output.src = dataURL; }); reader.readAsDataURL(input.files[0]); }; function change() { var file = document.getElementById('file'); file.addEventListener('change', openFile, false); } })();
Instance Properties: error
<input id="input2" type="file"><br> <div id="output2"></div>
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('loadstart', function() { reader.abort(); }); reader.addEventListener('loadend', function() { var output = document.getElementById('output2'); output.innerHTML = reader.error.message; }); reader.readAsDataURL(input.files[0]); }; function change() { var file = document.getElementById('input2'); file.addEventListener('change', openFile, false); } })();
Instance Properties: readyState
<input id="input3" type="file"><br> <div id="output3"></div> <div id="output3-2"></div> <div id="output3-3"></div>
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); var stateNames = {}; stateNames[FileReader.EMPTY] = 'EMPTY'; stateNames[FileReader.LOADING] = 'LOADING'; stateNames[FileReader.DONE] = 'DONE'; function openFile(e) { var input = e.target; var reader = new FileReader(); reader.addEventListener('load', function() { document.getElementById('output3').innerHTML = 'After load: ' + stateNames[reader.readyState]; }, false); document.getElementById('output3-2').innerHTML = 'Before read: ' + stateNames[reader.readyState]; reader.readAsDataURL(input.files[0]); document.getElementById('output3-3').innerHTML = 'Loading: ' + stateNames[reader.readyState]; } function change() { var file = document.getElementById('input3'); file.addEventListener('change', openFile, false); } })();
Instance Properties: result
<input id="input4" type="file"><br> <img id="output4">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('load', function() { var dataURL = reader.result; var output = document.getElementById('output4'); output.src = dataURL; }); reader.readAsDataURL(input.files[0]); }; function change() { var file = document.getElementById('input4'); file.addEventListener('change', openFile, false); } })();
Instance Properties: readAsArrayBuffer
<input id="input5" type="file"> <div id="output5"></div>
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('load', function() { var arrayBuffer = reader.result; document.getElementById('output5').innerHTML = arrayBuffer.byteLength; }); reader.readAsArrayBuffer(input.files[0]); }; function change() { var file = document.getElementById('input5'); file.addEventListener('change', openFile, false); } })();
Instance Properties: readAsDataURL
<input id="input6" type="file"><br> <img id="output6">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('load', function() { var dataURL = reader.result; document.getElementById('output6').src = dataURL; }); reader.readAsDataURL(input.files[0]); }; function change() { var file = document.getElementById('input6'); file.addEventListener('change', openFile, false); } })();
Instance Properties: readAsText
<input id="input7" type="file"> <div id="output7"></div>
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { var input = e.target; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.addEventListener('load', function() { var text = reader.result; document.getElementById('output7').innerHTML = text.substring(0, 200); }); reader.readAsDataURL(input.files[0]); }; function change() { var file = document.getElementById('input7'); file.addEventListener('change', openFile, false); } })();
Instance Event: onloadstart / loadstart
<input id="input8" type="file">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { console.log('entering openFile()'); var input = e.target; function printEventType(e) { console.log('got event: ' + e.type); }; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.onloadstart = printEventType; reader.onprogress = printEventType; reader.onload = printEventType; reader.onloadend = printEventType; console.log('starting read'); reader.readAsDataURL(input.files[0]); console.log('leaving openFile()'); }; function change() { var file = document.getElementById('input8'); file.addEventListener('change', openFile, false); } })();
Instance Event: onprogress / progress
<input id="input9" type="file">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { console.log('entering openFile()'); var input = e.target; function printEventType(e) { console.log('got event: ' + e.type); }; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.onloadstart = printEventType; reader.onprogress = printEventType; reader.onload = printEventType; reader.onloadend = printEventType; console.log('starting read'); reader.readAsDataURL(input.files[0]); console.log('leaving openFile()'); }; function change() { var file = document.getElementById('input9'); file.addEventListener('change', openFile, false); } })();
Instance Event: onload / load
<input id="input10" type="file">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { console.log('entering openFile()'); var input = e.target; function printEventType(e) { console.log('got event: ' + e.type); }; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.onloadstart = printEventType; reader.onprogress = printEventType; reader.onload = printEventType; reader.onloadend = printEventType; console.log('starting read'); reader.readAsDataURL(input.files[0]); console.log('leaving openFile()'); }; function change() { var file = document.getElementById('input10'); file.addEventListener('change', openFile, false); } })();
Instance Event: onabort / abort // onerror / error
<input id="input11" type="file">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { console.log('entering openFile()'); var input = e.target; function printEventType(e) { console.log('got event: ' + e.type); if (event.type === 'loadstart') { reader.abort(); } }; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.onloadstart = printEventType; reader.onprogress = printEventType; reader.onload = printEventType; reader.onloadend = printEventType; console.log('starting read'); reader.readAsDataURL(input.files[0]); console.log('leaving openFile()'); }; function change() { var file = document.getElementById('input11'); file.addEventListener('change', openFile, false); } })();
Instance Event: onloadend / loadend
<input id="input12" type="file">
;(function() { document.addEventListener('DOMContentLoaded', function() { change(); }, false); function openFile(e) { console.log('entering openFile()'); var input = e.target; function printEventType(e) { console.log('got event: ' + e.type); }; // FileReaderオブジェクトをインスタンス化 var reader = new FileReader(); reader.onloadstart = printEventType; reader.onprogress = printEventType; reader.onload = printEventType; reader.onloadend = printEventType; console.log('starting read'); reader.readAsDataURL(input.files[0]); console.log('leaving openFile()'); }; function change() { var file = document.getElementById('input12'); file.addEventListener('change', openFile, false); } })();
FileReaderのプロパティー
- readyState
- 以下に示す状態
- result
- ファイルの内容を読み込んだメソッドに合わせた型で表す
- error
- ファイルの読み込みで発生したエラーに関するDOMErrorオブジェクト
FileReader定数
- EMPTY
- FileReaderオブジェクトが生成されて、まだデータを読み込んでいない状態
- LOADING
- ファイルのデータを読み込んでいる状態
- DONE
- ファイルのデータをメモリ上にロードし終わったか、途中でエラーが発生した状態
FileReaderのメソッド
- readAsArrayBuffer()
- データをArrayBufferとして読み込む
- readAsText()
- データをテキストとして読み込む
- readAsDataURL()
- データをDataURLとして読み込む
- abort()
- データの読み込みを中断する
FileReaderのイベントハンドラ
- onloadstart
- 読込が完了したときに呼ばれる
- onprogress
- blobを読み込んでいるときに呼ばれる
- onload
- 読込が正常に終了したときに呼ばれる
- onabort
- 読込が中断されたときに呼ばれる
- onerror
- 読込が失敗したときに呼ばれる
- onloadend
- 成功か失敗かに関わらず、読込が終了したときに呼ばれる。