Подтвердить что ты не робот

Dropzone.js загружает только два файла, если для параметра autoProcessQueue установлено значение false

Я использую Dropzone.js, и я хочу, чтобы он выгружал не автоматически, а когда пользователь нажимает кнопку. Поэтому я установил параметр autoProcessQueue в false. Когда нажимается кнопка, вызывается метод processQueue(). Я бы предположил, что теперь обрабатывается полная очередь. Но дело не в этом. Будет загружено только количество файлов, указанное в параметре parallelUploads. Стандартное значение parallelUploads кажется равным 2. Которые обрабатываются и загружаются каждым кликом 2.

Нужно ли устанавливать parallelUploads на очень большое число, чтобы решить эту проблему?

Здесь мой полный код JS:

var myDropzone = new Dropzone("div#myId", {
  url: "http://www.torrentplease.com/dropzone.php",
  addRemoveLinks: true,
  thumbnailWidth: "80",
  thumbnailHeight: "80",
  dictCancelUpload: "Cancel",
  autoProcessQueue: false
});

myDropzone.on("drop", function(event) {
  $('.edit_tooltip .option_bar').animate({
    opacity: 1,
    top: "-5"
  });
});


$('.edit_tooltip .option_bar .button').click(function() {
  myDropzone.processQueue();
});
4b9b3361

Ответ 1

Добавить parallelUploads: 10 (Это ваш максимум нет)

Ответ 2

Здесь есть простой способ решить эту проблему:

https://github.com/enyo/dropzone/issues/253#issuecomment-22184190

"Если вы хотите, чтобы autoProcessQueue был истинным после первой загрузки, просто прослушайте событие обработки и установите this.options.autoProcessQueue = true внутри."

Так просто добавьте

this.on("processing", function() {
    this.options.autoProcessQueue = true;
});

Ответ 3

Мое решение:

// init dropzone with auto process queue false
var adPhotosDropzone = new Dropzone("#dropzone", {
    autoProcessQueue: false,
    parallelUploads: 3
});

$(document).on('click', '#btnUpload', function () {
    // enable auto process queue after uploading started
    adPhotosDropzone.options.autoProcessQueue = true;
    // queue processing
    adPhotosDropzone.processQueue();
});

// disable queue auto processing on upload complete
adPhotosDropzone.on("queuecomplete", function() {
    adPhotosDropzone.options.autoProcessQueue = false;
});

Ответ 4

Очень поздно, но, возможно, это поможет кому-то.

Я заметил, что когда я помещал maxFilesSize выше parallerUploads, он не работал.

Таким образом, последовательность для опций должна быть .

.
.
parallelUploads: 20,    
maxFilesize: 2, 
maxFiles: 20,
.
.

Ответ 5

Добавить овердрайв два события, например

обработка → Разрешить загрузку всего файла

queuecomplete → Возврат к нормальному

    init: function () {

            this.on("queuecomplete", function () {
                this.options.autoProcessQueue = false;
            });

            this.on("processing", function () {
                this.options.autoProcessQueue = true;
            });

    };

Ответ 6

Я думаю, что вы можете разрешить uploadMultiple и изменить файл dropzone.js.

Сначала разрешите uploadMultiple Затем измените этот код линии на dropzone.js:

return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));

для

return this.processFiles(queuedFiles.slice(0, queuedFiles.length));

Ответ 7

Немного поздно, но я не был доволен другими ответами, так что вот здесь.

Изменение параметра autoProcessingQueue (даже временно) после нажатия кнопки send означает, что если вы добавите другой файл в dropzone, в то время как другие все еще поставлены в очередь, он будет загружен без необходимости повторного нажатия отправки, чего я не хотел. И я не хотел использовать setTimeout или busyloop. Итак, как это сделать без:

Измените файл dropzone.js. Во-первых, в функции Dropzone вам нужно добавить второй массив файлов для хранения очереди при нажатии send:

function Dropzone(element, options) {
  ...
  this.files = [];
  this.files2 = [];

Затем сохраните файлы в нем, когда нажата кнопка отправки, изменив processQueue

Dropzone.prototype.processQueue = function() {
  this.files2 = this.getQueuedFiles();
  ...

Наконец, отредактируйте функцию _finished, чтобы при загрузке файла был отправлен другой файл, если в очереди были оставлены остатки, когда была нажата передача:

Dropzone.prototype._finished = function(files, responseText, e) {
  var file, _i, _len;
  for (_i = 0, _len = files.length; _i < _len; _i++) {
    file = files[_i];
    file.status = Dropzone.SUCCESS;
    this.emit("success", file, responseText, e);
    this.emit("complete", file);
    this.files2 = this.files2.filter(function(e) { return e.status == "queued" }); // Remove the files that are finished or already being uploaded
  }
  if (this.options.uploadMultiple) {
    this.emit("successmultiple", files, responseText, e);
    this.emit("completemultiple", files);
  }
  if (this.options.autoProcessQueue) {
    return this.processQueue();
  }
  else {
      if (typeof this.files2 != "undefined" && this.files2.length > 0) {
          this.processFiles(this.files2.slice(0,1)); // process the next file if there one
      }
  }
};

Ответ 8

я использовал эту зону с опцией (autoProcessQueue: false), и она загружает только 2 файла вместо целых. И я нашел этот обходной путь в ответе oligoil на вопрос git

Идея очень проста (поскольку мы хотим загружать файлы один за другим, запомните опцию!: D).

Он загружает несколько, но не более 1, после загрузки одного файла запускается следующая очередь!

Надеюсь, это поможет кому-то!

вот мой код, использующий эту идею (поскольку у меня есть 2 формы для загрузки, после загрузки всех изображений он отправит другие формы)

Dropzone.options.dropzoneForm = {
        paramName: "file", // The name that will be used to transfer the file
        autoProcessQueue: false,
        addRemoveLinks:true,
        parallelUploads : 1,
        maxFiles : 50,
        autoProcessQueue : false,
        autoQueue : true,
        dictDefaultMessage: "<strong>Drop files here or click to upload. </strong>",
        init: function () {
            ....

            this.on("complete", function (file) {
                if (this.getUploadingFiles().length === 0 && this.getQueuedFiles().length === 0) {
                    console.log("END ", this.getQueuedFiles().length);
                }
                else {
                    Dropzone.forElement("#dropzoneForm").processQueue();
                }
            });
        }
    };

Ответ 9

Это разрешило это для меня, не меняя код dropzone.js или не устанавливая параметр parallelUploads.

$('#submit').click(function(e){
  e.preventDefault();

  function tryQueue(){
    var numQueued=dz.getQueuedFiles().length;
    var numFiles=numQueued+dz.getUploadingFiles().length;
    if(numQueued>0){
      dz.processQueue();
    }
    if(numFiles>0){
      setTimeout(tryQueue,1000);
    }
    else window.location='/'; //redirect when finished
  }
  tryQueue();
});

Это предполагает, что dz является экземпляром dropzone. Он работает, вызывая processQueue, пока все не были загружены. Логика в processQueue заботится о возврате, если ничего не нужно делать, чтобы не было вреда в опросе.