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ć
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:
- Dodaj zwykły detektor zdarzeń zmiany wejścia pliku
- Pętla przez każdy plik z Zmień Zdarzenie, filtr dla żądanej walidacji
- wypychanie poprawnych plików do osobnej tablicy
- Użyj
FileReader
API do odczytu plików lokalnie - 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.
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..
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);
}
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