他の人が指摘したように、FileList
読み取り専用です。ただし、これらのファイルを別のファイルにプッシュすることで、これを回避できますArray
。その後、その精選されたファイルのリストを使用して、好きなことを行うことができます。それらをサーバーにアップロードすることが目標である場合は、FileReader
API を使用できます。
以下は、 を変更する必要を完全に回避する方法ですFileList
。手順:
- 通常のファイル入力変更イベントリスナーを追加
- 変更イベントから各ファイルをループし、必要な検証をフィルタリングします
- 有効なファイルを別の配列にプッシュする
- API を使用
FileReader
してローカルでファイルを読み取る
- 有効で処理済みのファイルをサーバーに送信する
イベント ハンドラと基本的なファイル ループ コード:
var validatedFiles = [];
$("#fileToUpload").on("change", function (event) {
var files = event.originalEvent.target.files;
files.forEach(function (file) {
if (file.name.matches(/something.txt/)) {
validatedFiles.push(file); // Simplest case
} else {
/* do something else */
}
});
});
以下は、ファイル ループのより複雑なバージョンで、FileReader
API を使用してファイルをブラウザーに読み込み、必要に応じてそれを Base64 でエンコードされた BLOB としてサーバーに送信する方法を示しています。
files.forEach(function (file) {
if (file.name.matches(/something.txt/)) { // You could also do more complicated validation after processing the file client side
var reader = new FileReader();
// Setup listener
reader.onload = (function (processedFile) {
return function (e) {
var fileData = { name : processedFile.name, fileData : e.target.result };
// Submit individual file to server
$.post("/your/url/here", fileData);
// or add to list to submit as group later
validatedFiles.push(fileData);
};
})(file);
// Process file
reader.readAsDataURL(file);
} else {
/* still do something else */
}
});
FileReader
API利用時の注意事項です。ファイルを Base64 でエンコードすると、サイズが約 30% 増加します。それが受け入れられない場合は、別の方法を試す必要があります。