2013-08-05 9 views
26

Używam Dropzone.js i chcę, aby przesyłać odrzucone nie automatycznie, ale gdy użytkownik kliknie przycisk. Dlatego ustawiam opcję autoProcessQueue na false. Po kliknięciu przycisku wywoływana jest metoda processQueue(). Przypuszczam, że teraz przetwarzana jest cała kolejka. Ale tak nie jest. Zostanie przesłana tylko liczba plików określonych w opcji parallelUploads. Standardową wartością jest parallelUploads 2. Które pliki Click 2 są przetwarzane i przesyłane.Dropzone.js przesyła tylko dwa pliki, gdy autoProcessQueue jest ustawione na false

Czy muszę ustawić parallelUploads na bardzo wysoką liczbę, aby teraz rozwiązać ten problem?

Oto mój pełny kod 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(); 
}); 
+0

To dlatego 'parallelUp ładuje domyślnie 2, jeśli nie jest ustawione w twoich opcjach. – mcometa

Odpowiedz

30

Dodaj parallelUploads: 10 (ta ma swoją max)

+0

Dziękuję bardzo! Spędziłem pół dnia na rozwiązaniu tego problemu, a na koniec twoja odpowiedź pomaga mi. –

+1

Aby było jasne, to podejście wymaga ustawienia '' 'parallelUploads''' równego lub większego niż' '' maxFiles''', w przeciwnym razie, jeśli użytkownik upuści więcej niż pliki '' 'paralleluploads''', ostatnie kilka może nie zostać przesłanych. Odpowiedź Bianki poniżej wydaje się bardziej "poprawna" w tym sensie, że pozwala ona '' 'parallelUploads''' działać niezależnie od' '' maxFiles''' w sposób, w jaki został zaprojektowany. – tohster

+1

Nie jestem pewien, czy to najlepsze rozwiązanie. Nie, jeśli chcemy, aby przesłano więcej niż 10 plików. –

0

myślę, że można zezwolić uploadMultiple i zmienić dropzone.js pliku.

Po pierwsze, pozwalają uploadMultiple Następnie zmienić ten kod linię do dropzone.js:

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

do

this.processFiles powrotne (queuedFiles.slice (0 queuedFiles.length));

-1

Rozwiązałem to dla mnie, nie zmieniając żadnego kodu dropzone.js lub unieważniając ustawienie 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(); 
}); 

Zakłada się, że dz jest instancją dropzone. Działa poprzez wywołanie processQueue, dopóki wszystkie nie zostaną przesłane. Logika w procesie processQueue dba o zwrot, jeśli nic nie trzeba robić, aby nie zaszkodzić w głosowaniu.

22

Jest prosty sposób, aby rozwiązać ten problem, który można znaleźć tutaj:

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

„Jeśli chcesz autoProcessQueue być prawda po pierwszym przesłaniu, a potem po prostu słuchać przypadku przetwarzania i ustaw to .options.autoProcessQueue = true; wewnątrz."

Więc po prostu dodać

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

Ponieważ używałem tego z zewnętrznego procesu do rozpoczęcia przesyłania, oto, jak wyglądał mój kod: myDropzone.options.autoProcessQueue = true; Posiadałem ustawienie parraleleupload = 1, co spowodowało, że każdy plik został przesłany 1 przez 1. DZIĘKI za prawidłowe rozwiązanie. – Andy

+0

wielkie dzięki! to było pomocne! –

+0

To naprawdę sprawia, że ​​pliki są ładowane sekwencyjnie, ale teraz URL akcji jest wywoływany dla każdego pojedynczego pliku! W moim przykładzie za pomocą tego rozwiązania otrzymuję tyle e-maili, ile plików. a tego nie chcę!Chciałbym, aby pliki były przesyłane sekwencyjnie, a dopiero potem wywoływano adres URL akcji. Czy to możliwe? – gota

13

Moje rozwiązanie to:

// 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; 
}); 
+0

Działa idealnie, thx! –

1

Dodaj overdrive dwa zdarzenia jak

przetwarzania -> pozwala na wgranie wszystkich plików

queuecomplete -> Return do normalnego

init: function() { 

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

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

    }; 
1

Bardzo późno, ale może ci to pomoże.

Zauważyłem, że gdy umieściłem maxFilesSize powyżej parallerUploads, to nie zadziałało.

Tak więc kolejność opcji powinna wynosić .

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

nie rozwiązał dla mnie – gota

0

Trochę za późno, ale nie byłem zadowolony z innych odpowiedzi, więc oto moje.

Zmiana wartości parametru autoProcessingQueue (nawet tymczasowo) po kliknięciu Wyślij oznacza, że ​​jeśli dodasz inny plik do strefy zrzutu, podczas gdy inne są jeszcze w kolejce, zostanie on przesłany bez konieczności ponownego wysyłania, co nie było mi potrzebne. I nie chciałem też używać setTimeout ani pętli roboczej. Oto jak to zrobić bez:

Zmodyfikuj plik dropzone.js. Po pierwsze, w funkcji DropZone, trzeba dodać drugą tablicę plików do przechowywania kolejkę podczas wysyłania zostanie naciśnięty:

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

Następnie zapisz pliki na nim podczas wysyłania kliknięciu modyfikując processQueue

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

Wreszcie edytować funkcję _finished tak, że gdy plik jest wykonywana przesłaniem, kolejny plik wysłany, jeśli nie było z nich nadal pozostające w kolejce gdy wyślij został wciśnięty:

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's one 
     } 
    } 
};