Come altre persone sottolineato, FileList
è di sola lettura. È possibile aggirare questo spingendo quei file in un separato Array
però. Puoi quindi fare quello che vuoi con la lista dei file così curata. Se l'obiettivo è il caricamento su un server, è possibile utilizzare l'API FileReader
.
Di seguito è riportato un modo per evitare completamente la necessità di modificare il FileList
. Passi:
- Aggiungi normale cambio di input file di listener di eventi
- loop attraverso ogni file da evento change, filtro per la convalida desiderato
file validi
- Spingere in array separato
- Usa
FileReader
API per leggere i file in locale
- Invia validi, file elaborati al server Handl
Event er e il codice del ciclo di file di base:
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 */
}
});
});
Qui di seguito è una versione più complicata del ciclo di file che mostra come è possibile utilizzare l'FileReader
API per caricare il file nel browser e, facoltativamente, lo sottopone ad un server come Base64 blob codificato.
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 */
}
});
Una nota di cautela sull'utilizzo FileReader
API. Base64 che codifica un file aumenterà le sue dimensioni di circa il 30%. Se ciò non è accettabile, dovrai provare qualcos'altro.
fonte
2013-10-07 23:02:39
cosa hai intenzione di fare con i file? una volta che l'utente li ha caricati, vengono semplicemente copiati nella tua cartella tmp e le loro informazioni sono contenute nell'array che hai, quindi quando vai a processarli basta saltare quelli che hanno le estensioni sbagliate ... –
Ragazzi, non è un array, è un oggetto con attributo "0", "1", "2" quindi non posso fare operazioni con array qui –
Sfortunatamente, non è possibile modificare i file in una FileList, poiché sono di sola lettura. È anche apparentemente impossibile creare una nuova lista file. Qualche possibilità che il tuo problema possa essere risolto usando l'attributo 'accetta' dell'elemento di input? Puoi rimuovere TUTTI i file dalla FileList con questo: '$ (" # fileToUpload ") [0] .value = ''' –