JavaScript удалить файл из списка файлов для загрузки



Есть код https://jsfiddle.net/bfzmm1hc/1 все выглядит нормально, но я хочу удалить некоторые файлы из набора.



Я уже нашел их:




Я знаю, что Объект FileList доступен только для чтения, поэтому я могу просто скопировать файлы в новый массив. Но что мне делать с этим новым массивом объектов File? Я не могу присвоить его свойству files...

1300   2  

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

    Ничего не найдено.