FileReader APIの使用例を誰かが私に教えてくれますか?
undefined
が返ってくるようです。
<!doctype html>
<html>
<script>
function handle_files(files) {
console.log(files)
reader = new FileReader()
ret = []
for (i = 0; i < files.length; i++) {
file = files[i]
console.log(file)
text = reader.readAsText(file) //readAsdataURL
console.log(text) //undefined
ret.Push(text)
}
console.log(ret) // [undefined]
}
</script>
<body>
FileReader Test
<input type="file" onchange="handle_files(this.files)">
</body>
</html>
私の問題は、FileReaderが同期的であると想定していたことです。これが正しい方法です。 Chromeを使用している場合、このコードはサーバー(localhostまたはサイト)で実行する必要があります。ローカルファイルでは機能しません。
<!doctype html>
<html>
<script>
function handle_files(files) {
for (i = 0; i < files.length; i++) {
file = files[i]
console.log(file)
var reader = new FileReader()
ret = []
reader.onload = function(e) {
console.log(e.target.result)
}
reader.onerror = function(stuff) {
console.log("error", stuff)
console.log (stuff.getMessage())
}
reader.readAsText(file) //readAsdataURL
}
}
</script>
<body>
FileReader that works!
<input type="file" multiple onchange="handle_files(this.files)">
</body>
</html>
File API FileReaderオブジェクトは、Chromeでの動作は、FireFox、Opera、またはInternet Explorer 10での動作と同じです(うん、 IEで動作 ))。
まず、リーダーの新しいインスタンスを宣言します。
var reader = new FileReader();
さまざまなコールバックを定義 イベント :
reader.onloadend = function( ){
document.body.style.backgroundImage = "url(" + this.result + ")";
}
そして、それに何かを渡して読んでください:
reader.readAsDataURL( file );
フィドル: http://jsfiddle.net/jonathansampson/K3A9r/
複数のファイルで作業している場合、状況は少し異なります。結果のFileListを循環する必要があることは明らかですが、クロージャーを使用して、ファイルデータが多数の反復で改ざんされないようにする必要もあります。
// Continue only if we have proper support
if ( window.FileReader ) {
// Provide our logic upon the change even of our input
document.getElementById("collection").onchange = function(){
// Couple variables for handling each file
var counter = -1, file;
// Cycle over all files
while ( file = this.files[ ++counter ] ) {
// Create a reader for this particular file
var reader = new FileReader();
// Respond to the onloadend event of the reader
reader.onloadend = (function(file){
return function(){
var image = new Image();
image.height = 100;
image.title = file.name;
image.src = /^image/.test(file.type) ? this.result : "t9QlH.png";
document.body.appendChild( image );
}
})(file);
// Begin reading data for this file
reader.readAsDataURL( file );
}
}
}
フィドル: http://jsfiddle.net/jonathansampson/jPTV3/
FileReaderはほとんどすべての最新のブラウザーで使用できますが、古いブラウザーのユーザーに騒動を引き起こさないようにする必要があります。 FileReaderを使用する前に、ウィンドウオブジェクトの存在を確認してください。
if ( window.FileReader ) {
// Safe to use FileReader
}
Chromeのfile:///パスでこれを実行すると、エクスペリエンスが破損します。デフォルトでは、現在のバージョンのChromeしないでくださいt file:///ページが他のファイルにアクセスすることを許可します。この動作を変更できますChrome --allow-file-access-from-files
フラグ。
このメソッドは、開かれたブラウザのインスタンス上のファイルへのファイルアクセスのみを許可することに注意してください。これを将来のすべてのブラウザインスタンスに当てはめる場合は、デスクトップからショートカットを変更できます。 Chromeショートカットを右クリックして、プロパティに移動します。次に、ターゲットの最後にフラグを追加します。