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
- 成功か失敗かに関わらず、読込が終了したときに呼ばれる。