正如其他人所指出的,FileList
是隻讀的。你可以通過將這些文件推入單獨的Array
來解決這個問題。然後,您可以使用該策劃的文件列表執行任何您想要的操作。如果將它們上傳到服務器是目標,則可以使用FileReader
API。
下面是完全避免需要修改FileList
的方法。 步驟:
- 通過從改變事件時,濾波器的每個文件添加正常文件輸入變化事件監聽器
- 迴路的期望驗證
- 推有效文件到單獨的陣列
- 使用
FileReader
API在本地讀取文件
- 將有效的處理文件提交給服務器
事件處理ER和基本的文件循環代碼:
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%左右。如果這是不可接受的,你將需要嘗試其他的東西。
你打算如何處理這些文件?一旦用戶上傳他們,他們只是複製到你的tmp文件夾,他們的信息保存在你有的數組中,所以當你去處理它們時,只需跳過任何有錯誤擴展名的地方... –
夥計們,它不是一個數組,它的屬性爲「0」,「1」,「2」的對象,所以我不能在這裏做數組操作。 –
不幸的是,你不能修改FileList中的文件,因爲它們是隻讀的。創建一個新的FileList也是不可能的。使用輸入元素的「接受」屬性可以解決您的問題嗎?您可以使用以下命令從FileList中刪除所有文件:'$(「#fileToUpload」)[0] .value =''' –