JavaScript удалить файл из списка файлов для загрузки
Есть код https://jsfiddle.net/bfzmm1hc/1 все выглядит нормально, но я хочу удалить некоторые файлы из набора.
Я уже нашел их:
Как удалить один конкретный выбранный файл из элемента управления input file
input type=file multiple, delete items
Я знаю, что Объект FileList доступен только для чтения, поэтому я могу просто скопировать файлы в новый массив. Но что мне делать с этим новым массивом объектов File? Я не могу присвоить его свойству files...
2 ответов:
Так как вы не можете редактировать только чтение
input.filesатрибут, вы должны загрузить форму с помощьюXMLHttpRequestи отправить объектFormData. Я также покажу вам, как использоватьURL.createObjectURLчтобы легче получить URI от объектаFile:
var SomeCl = { count: 0, init: function() { $('#images').change(this.onInputChange); }, onInputChange: function() { // reset preview $('.container').empty(); // reset count SomeCl.count = 0; // process files SomeCl.processFiles(this.files, function(files) { // filtered files console.log(files); // uncomment this line to upload the filtered files SomeCl.upload('url', 'POST', $('#upload').get(0), files, 'images[]'); }); }, processFiles: function(files, callback) { // your filter logic goes here, this is just example // filtered files var upload = []; // limit to first 4 image files Array.prototype.forEach.call(files, function(file) { if (file.type.slice(0, 5) === 'image' && upload.length < 4) { // add file to filter upload.push(file); // increment count SomeCl.count++; // show preview SomeCl.preview(file); } }); callback(upload); }, upload: function(method, url, form, files, filename) { // create a FormData object from the form var fd = new FormData(form); // delete the files in the <form> from the FormData fd.delete(filename); // add the filtered files instead fd.append(filename, files); // demonstrate that the entire form has been attached for (var key of fd.keys()) { console.log(key, fd.getAll(key)); } // use xhr request var xhr = new XMLHttpRequest(); xhr.open(method, url, true); xhr.addEventListener('progress', function(e) { console.log('lengthComputable', e.lengthComputable); console.log(e.loaded + '/' + e.total); }); xhr.addEventListener('load', function(e) { console.log('uploaded'); }); xhr.addEventListener('error', function(e) { console.log('this is just a demo'); }); xhr.send(fd); }, preview: function(file) { // create a temporary URI from the File var url = URL.createObjectURL(file); // append a preview $('.container').append($('<img/>').attr('src', url)); } }; SomeCl.init();.container img { max-width: 250px; max-height: 250px; }<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <form id="upload"> <input name="other" type="hidden" value="something else"> <input name="images[]" id="images" multiple="multiple" type="file"> <div class="container"></div> </form>
Я нашел обходной путь. Это не потребует AJAX для запроса вообще, и форма может быть отправлена на сервер. В принципе, вы можете создать
hiddenилиtextвходные данные и установить его атрибутvalueв строку base64, созданную после обработки выбранного файла.<input type=hidden value=${base64string} />Вы, вероятно, рассмотрите идею создания нескольких входных файлов вместо входных
textилиhidden. Это не сработает, так как мы не можем присвоить ему значение.Этот метод будет включать входной файл в данные отправленный в базу данных и проигнорировать входной файл вы можете:
- в бэк-энде не учитывают поле;
- можно задать атрибут
disabledдля входного файла перед сериализацией формы;- удалите элемент DOM перед отправкой данных.
Когда вы хотите удалить файл, просто получите индекс элемента и удалите входной элемент (текстовый или скрытый) из DOM.
Требования:
- Вам нужно написать логику, чтобы конвертируйте файлы в base64 и храните все файлы в массиве всякий раз, когда входной файл запускает событие
change.Плюсы:
Это в основном даст вам много контроля, и вы можете фильтровать, сравнивая файлы, проверять размер файла, тип MIME и так далее..
Comments