Comment supprimer un fichier sélectionné spécifique du contrôle des fichiers d'entrée

comment supprimer un fichier spécifique sélectionné du contrôle des fichiers d'entrée?

j'ai un contrôle de fichier d'entrée avec l'option de sélectionner plusieurs fichiers; cependant, je veux valider un fichier et s'il a une extension incorrecte alors je devrais supprimer ce fichier 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 est la capture d'écran de l'objet mais je ne suis pas en mesure de le modifier

enter image description here

35
demandé sur Gone Coding 2013-09-28 01:31:32

3 réponses

comme d'autres personnes l'ont souligné, FileList est en lecture seule. Vous pouvez contourner cela en poussant ces fichiers dans un Array séparé cependant. Vous pouvez alors faire ce que vous voulez avec cette liste de dossiers. Si le but est de les télécharger sur un serveur, vous pouvez utiliser L'API FileReader .

ci-dessous est un rond-point pour éviter complètement la nécessité de modifier le FileList . Étapes:

  1. Ajouter un fichier d'entrée changement écouteur d'événement
  2. boucle à travers chaque fichier de l'événement de changement, filtre pour la validation désirée
  3. Push valide les fichiers dans le tableau séparé
  4. utiliser FileReader API pour lire les fichiers localement
  5. soumettre des fichiers valides et traités au serveur

gestionnaire d'Événement et de fichier de base de la boucle de code:

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 */
    }
  });
});

ci-dessous est une version plus compliquée de la boucle de fichier qui montre comment vous pouvez utiliser l'API FileReader pour charger le fichier dans le navigateur et éventuellement le soumettre à un serveur comme un blob encodé 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 d'avertissement sur l'utilisation de FileReader de l'API. Base64 Encoder un fichier augmente sa taille d'environ 30%. Si cela n'est pas acceptable, vous devrez essayer autre chose.

32
répondu Andrew Hubbs 2013-10-07 23:02:39

j'ai pensé que je devrais ajouter mon commentaire ici aussi bien ici (j'ai répondu ici: JavaScript supprimer le fichier de FileList à télécharger )

j'ai trouvé une solution. Cela ne nécessitera pas D'AJAX pour la requête et le formulaire peut être envoyé au serveur. En gros, vous pouvez créer une entrée hidden ou text et définir l'attribut value à la chaîne de caractères base64 créée après le traitement du fichier sélectionné.

<input type=hidden value=${base64string} />

vous envisagerez probablement l'idée de créer un fichier d'entrée multiple au lieu de text ou hidden . Cela ne fonctionnera pas car nous ne pouvons pas lui attribuer de valeur.

Cette méthode va inclure le fichier d'entrée dans les données envoyées à la base de données et d'ignorer le fichier d'entrée, vous pouvez:

  • dans le fond ne considérez pas le terrain;
  • vous pouvez définir l'attribut disabled entrer le fichier avant de sérialiser le formulaire;
  • supprimer L'élément DOM avant d'envoyer des données.

lorsque vous voulez supprimer un fichier, récupérez l'index de l'élément et supprimez l'élément d'entrée (texte ou caché) du DOM.

exigences:

  • vous devez écrire la logique pour convertir les fichiers dans base64 et stocker tous les fichiers à l'intérieur d'un tableau chaque fois que le le fichier d'entrée déclenche l'événement change .

Pour:

  • cela vous donnera essentiellement beaucoup de contrôle et vous pouvez filtrer, comparer des fichiers, vérifier la taille des fichiers, type MIME, et ainsi de suite..
2
répondu Michael Mammoliti 2017-08-30 11:22:21

html

<input id="fileInput" name="fileInput" type="file" />
<input onclick="clearFileInput()" type="button" value="Clear" />

javascript

    function clearFileInput(){
        var oldInput = document.getElementById("fileInput");

        var newInput = document.createElement("input");

        newInput.type = "file";
        newInput.id = oldInput.id;
        newInput.name = oldInput.name;
        newInput.className = oldInput.className;
        newInput.style.cssText = oldInput.style.cssText;
        // copy any other relevant attributes

        oldInput.parentNode.replaceChild(newInput, oldInput);
    }
-9
répondu Ehsan 2014-09-27 11:52:41