Ответ 1
Добавить parallelUploads: 10 (Это ваш максимум нет)
Я использую 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();
});
Добавить parallelUploads: 10 (Это ваш максимум нет)
Здесь есть простой способ решить эту проблему:
https://github.com/enyo/dropzone/issues/253#issuecomment-22184190
"Если вы хотите, чтобы autoProcessQueue был истинным после первой загрузки, просто прослушайте событие обработки и установите this.options.autoProcessQueue = true внутри."
Так просто добавьте
this.on("processing", function() {
this.options.autoProcessQueue = true;
});
Мое решение:
// 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;
});
Очень поздно, но, возможно, это поможет кому-то.
Я заметил, что когда я помещал maxFilesSize выше parallerUploads, он не работал.
Таким образом, последовательность для опций должна быть .
.
.
parallelUploads: 20,
maxFilesize: 2,
maxFiles: 20,
.
.
Добавить овердрайв два события, например
обработка → Разрешить загрузку всего файла
queuecomplete → Возврат к нормальному
init: function () {
this.on("queuecomplete", function () {
this.options.autoProcessQueue = false;
});
this.on("processing", function () {
this.options.autoProcessQueue = true;
});
};
Я думаю, что вы можете разрешить uploadMultiple и изменить файл dropzone.js.
Сначала разрешите uploadMultiple Затем измените этот код линии на dropzone.js:
return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));
для
return this.processFiles(queuedFiles.slice(0, queuedFiles.length));
Немного поздно, но я не был доволен другими ответами, так что вот здесь.
Изменение параметра 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
}
}
};
я использовал эту зону с опцией (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();
}
});
}
};
Это разрешило это для меня, не меняя код 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 заботится о возврате, если ничего не нужно делать, чтобы не было вреда в опросе.