Jak usunąć jeden określony wybrany plik z kontrolki pliku wejściowego

Jak usunąć jeden konkretny wybrany plik z kontrolki pliku wejściowego?

Mam kontrolkę pliku wejściowego z opcją wyboru wielu plików; jednak chcę zweryfikować plik i jeśli ma złe rozszerzenie, to powinienem usunąć ten plik z samej kontrolki pliku, czy to możliwe?

Próbowałem jak poniżej

<input type="file" name="fileToUpload" id="fileToUpload" multiple/>


<script> $("#fileToUpload")[0].files[0] </script>

Poniżej znajduje się zrzut ekranu obiektu, ale nie jestem w stanie go zmodyfikować

Tutaj wpisz opis obrazka

Author: Gone Coding, 2013-09-28

3 answers

Jak wskazywali inni, FileList jest tylko do odczytu. Możesz to obejść, przesuwając te pliki do osobnego Array. Następnie możesz zrobić, co chcesz, z tą wyselekcjonowaną listą plików. Jeśli przesłanie ich na serwer jest celem, możesz użyć FileReader API.

Poniżej znajduje się okrągły sposób na całkowite uniknięcie konieczności modyfikowania FileList. Kroki:

  1. Dodaj zwykły detektor zdarzeń zmiany wejścia pliku
  2. Pętla przez każdy plik z Zmień Zdarzenie, filtr dla żądanej walidacji
  3. wypychanie poprawnych plików do osobnej tablicy
  4. Użyj FileReader API do odczytu plików lokalnie
  5. Prześlij poprawne, przetworzone pliki na Serwer

Obsługa zdarzenia i podstawowy kod pętli pliku:

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

Poniżej znajduje się bardziej skomplikowana wersja pętli plików, która pokazuje, w jaki sposób można użyć API FileReader, aby załadować plik do przeglądarki i opcjonalnie przesłać go na serwer jako zakodowany obiekt blob 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 */
    }
  });

Uwaga o używaniu API {[4] }. Base64 kodowanie pliku zwiększy jego rozmiar o około 30%. Jeśli to nie jest do przyjęcia, musisz spróbować czegoś innego.

 32
Author: Andrew Hubbs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-07 23:02:39

Pomyślałem, że powinienem dodać swój komentarz również tutaj (odpowiedziałem tutaj: JavaScript usuń plik z listy plików do przesłania)

Znalazłem obejście. To nie będzie wymagało AJAX dla żądania w ogóle i formularz może być wysłany do serwera. Zasadniczo można utworzyć wejście hidden lub text i ustawić atrybut value na łańcuchu base64 utworzonym po przetworzeniu wybranego pliku.

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

Prawdopodobnie rozważysz pomysł utworzenia wielu wejść plik zamiast wejścia text lub hidden. To nie zadziała, ponieważ nie możemy przypisać mu wartości.

Ta metoda będzie zawierać plik wejściowy w danych wysyłanych do bazy danych i zignorować plik wejściowy można:

  • W back-endzie nie rozważ pola;
  • możesz ustawić atrybut disabled do pliku wejściowego przed serializacją formularza;
  • Usuń element DOM przed wysłaniem danych.

Gdy chcesz usunąć plik po prostu pobierz indeks element i Usuń element wejściowy (tekstowy lub ukryty) z DOM.

Wymagania:

  • musisz zapisać logikę do konwersji plików w base64 i zapisać wszystkie pliki wewnątrz tablicy za każdym razem, gdy plik wejściowy wywoła zdarzenie change.

Plusy:

  • to w zasadzie da ci dużo kontroli i możesz filtrować, porównywać pliki, sprawdzać Rozmiar pliku, typ MIME i tak dalej..
 2
Author: Michael Mammoliti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
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
Author: Ehsan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-27 11:52:41