Comment supprimer un fichier sélectionné spécifique du contrôle de fichier d'entrée?
J'ai un contrôle de fichier d'entrée avec la possibilité de sélectionner plusieurs fichiers; Cependant, je veux valider un fichier et s'il a une mauvaise extension, je dois le supprimer du contrôle de fichier lui-même. Est-ce possible?
J'ai essayé comme ci-dessous
<input type="file" name="fileToUpload" id="fileToUpload" multiple/>
<script> $("#fileToUpload")[0].files[0] </script>
Ci-dessous la capture d'écran de l'objet mais je ne peux pas le modifier.
Comme d'autres personnes l'ont souligné, FileList
est en lecture seule. Vous pouvez contourner ce problème en plaçant ces fichiers dans un Array
séparé. Vous pouvez ensuite faire ce que vous voulez avec cette liste de fichiers organisée. Si vous souhaitez les télécharger sur un serveur, vous pouvez utiliser l'API FileReader
.
Vous trouverez ci-dessous un moyen d'éviter complètement de devoir modifier le FileList
. Pas:
FileReader
API pour lire les fichiers localementGestionnaire d'événements et code de boucle de fichier de 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 */
}
});
});
Vous trouverez ci-dessous une version plus compliquée de la boucle de fichiers qui montre comment utiliser l'API FileReader
pour charger le fichier dans le navigateur et éventuellement le soumettre à un serveur sous la forme d'un blob codé en Base64.
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 */
}
});
Une note de prudence sur l'utilisation de FileReader
API. Le codage Base64 d’un fichier augmentera sa taille d’environ 30%. Si cela n'est pas acceptable, vous devrez essayer autre chose.
Je pensais que je devrais ajouter mon commentaire ici aussi ici (j'ai répondu ici: JavaScript supprime le fichier de la liste à télécharger )
J'ai trouvé une solution de contournement. Cela ne nécessitera pas AJAX pour la requête et le formulaire peut être envoyé au serveur. Vous pouvez créer une entrée hidden
ou text
et la définir c'est value
attribut à la chaîne base64 créée après le traitement du fichier sélectionné.
<input type=hidden value=${base64string} />
Vous envisagerez probablement de créer plusieurs fichiers d'entrée à la place de l'entrée text
ou hidden
. Cela ne fonctionnera pas car nous ne pouvons pas lui attribuer de valeur.
Cette méthode inclura le fichier d'entrée dans les données envoyées à la base de données et pour ignorer le fichier d'entrée, vous pourriez:
disabled
dans le fichier d'entrée avant de sérialiser le formulaire;Lorsque vous souhaitez supprimer un fichier, obtenez simplement l'index de l'élément et supprimez l'élément d'entrée (texte ou masqué) du DOM.
Conditions requises:
change
.Avantages: