2013-08-04 13 views
53

A seconda del caso d'uso, come posso limitare il numero di file consentito da dropzone.js?Come limitare il numero di file dropzone.js caricati?

Ad esempio, potrebbe essere necessario consentire solo 1, 2 o 4 file caricati.

Non è uploadMultiple. Sfortunatamente, uploadMultiple si applica solo al numero di file gestiti per richiesta.

+0

Usa maxfiles. Questo aiuterà –

risposta

59

Nowell pointed it out that this has been addressed a partire dal 6 agosto, 2013. Un esempio di lavoro utilizzando questo modulo potrebbe essere:

<form class="dropzone" id="my-awesome-dropzone"></form> 

È possibile utilizzare questo JavaScript:

Dropzone.options.myAwesomeDropzone = { 
    maxFiles: 1, 
    accept: function(file, done) { 
    console.log("uploaded"); 
    done(); 
    }, 
    init: function() { 
    this.on("maxfilesexceeded", function(file){ 
     alert("No more files please!"); 
    }); 
    } 
}; 

L'elemento dropzone anche ottiene uno stile speciale, quindi puoi fare cose come:

<style> 
    .dz-max-files-reached {background-color: red}; 
</style> 
+0

non dovrebbe essere '

'? –

+2

@ MKYung So che questo è quasi un anno dopo il fatto, ma l'id è tirato da Dropzone e enyo fa la cassa del cammello per te. Quindi chiamarlo è molto più facile. (Può essere un po 'confuso in un primo momento ovviamente ... ma funziona così non mi lamento.) –

+1

Che funziona bene quando si aggiunge 1 file, quindi il prossimo. Sebbene, se selezioni più file sulla tua macchina e li trascini tutti nel modulo dropzone, tutti vengono aggiunti. Come impedirlo? – trs

26

maxFiles: 1 fa il lavoro, ma se si desidera anche rimuovere i file aggiuntivi che si possono utilizzare questo codice di esempio preso dal Wiki page:

Come posso limitare il numero di file?

Sei fortunato! A partire da 3.7.0 Dropzone supporta l'opzione maxFiles . Basta impostarlo sulla quantità desiderata e sei a posto. Se non si desidera che i file respinti per essere visualizzati, basta registrarsi per l'evento maxfilesexceeded, e rimuovere immediatamente il file:

myDropzone.on("maxfilesexceeded", function(file) 
{ 
    this.removeFile(file); 
}); 
124

ho raggiunto questo un modo leggermente diverso. Rimuovo il vecchio file abbandonato ogni volta che viene aggiunto un nuovo file. Funziona come sovrascrivere il file che è stata l'esperienza utente che stavo andando qui.

Dropzone.options.myAwesomeDropzone = { 
    accept: function(file, done) { 
    console.log("uploaded"); 
    done(); 
    }, 
    init: function() { 
    this.on("addedfile", function() { 
     if (this.files[1]!=null){ 
     this.removeFile(this.files[0]); 
     } 
    }); 
    } 
}; 
+4

Funziona molto bene. Le altre risposte no. Puoi anche fare lo stesso lavoro all'interno della funzione di accettazione. "this.files" esiste anche lì. Questo accorcia il codice un po '. – Tom

+0

dove inserire questo codice all'interno dei codici dropzone.js o html dove il modulo è posizionato –

+1

Questa è un'ottima risposta a una domanda diversa (Come sovrascrivere un file precedentemente caricato). – Rosa

53

ho pensato che il processo di caricamento singolo file più intuitivo è stato quello di sostituire il file precedente su di una nuova voce.

$(".drop-image").dropzone({ 
    url: '/cart?upload-engraving=true', 
    maxFiles: 1, 
    maxfilesexceeded: function(file) { 
     this.removeAllFiles(); 
     this.addFile(file); 
    } 
}) 
+2

Questo non ha funzionato per me - ma l'altra risposta di @oneirois lo fa. –

+0

Grazie per questo suggerimento, questo è quello che stavo cercando. Inoltre, non dimenticare di mantenere il lato file server, se applicabile (ad esempio: il file precedente viene eliminato). –

+0

Questo non funziona quando autoProcessQueue è falso. Tuttavia, si attiva quando maxFiles è 0 e autoProcessQueue è falso. Questo deve essere un bug. – Daantje

0

Il problema con le soluzioni fornite è che è possibile caricare solo 1 file in assoluto. Nel mio caso, avevo bisogno di caricare solo 1 file alla volta (su click o su drop).

Questa era la mia soluzione ..

Dropzone.options.myDropzone = { 
     maxFiles: 2, 
     init: function() { 
      this.handleFiles = function(files) { 
       var file, _i, _len, _results; 
       _results = []; 
       for (_i = 0, _len = files.length; _i < _len; _i++) { 
        file = files[_i]; 
        _results.push(this.addFile(file)); 
        // Make sure we don't handle more files than requested 
        if (this.options.maxFiles != null && this.options.maxFiles > 0 && _i >= (this.options.maxFiles - 1)) { 
         break; 
        } 
       } 
       return _results; 
      }; 
      this._addFilesFromItems = function(items) { 
       var entry, item, _i, _len, _results; 
       _results = []; 
       for (_i = 0, _len = items.length; _i < _len; _i++) { 
        item = items[_i]; 
        if ((item.webkitGetAsEntry != null) && (entry = item.webkitGetAsEntry())) { 
         if (entry.isFile) { 
          _results.push(this.addFile(item.getAsFile())); 
         } else if (entry.isDirectory) { 
          _results.push(this._addFilesFromDirectory(entry, entry.name)); 
         } else { 
          _results.push(void 0); 
         } 
        } else if (item.getAsFile != null) { 
         if ((item.kind == null) || item.kind === "file") { 
          _results.push(this.addFile(item.getAsFile())); 
         } else { 
          _results.push(void 0); 
         } 
        } else { 
         _results.push(void 0); 
        } 
        // Make sure we don't handle more files than requested 
        if (this.options.maxFiles != null && this.options.maxFiles > 0 && _i >= (this.options.maxFiles - 1)) { 
         break; 
        } 
       } 
       return _results; 
      }; 
     } 
    }; 

Spero che questo aiuti;)

0

vorrei sottolineare. forse questo mi capita, TUTTAVIA, quando uso this.removeAllFiles() in dropzone, spara l'evento COMPLETO e questo succede, quello che ho fatto è stato controllare se il file Data era vuoto o meno così potevo effettivamente inviare il modulo.

0

Perché non utilizzare semplicemente CSS per disabilitare l'evento click. Quando viene raggiunto il numero massimo di file, Dropzone aggiungerà automaticamente una classe di file dz-max-raggiunti.

usare i CSS per disabilitare cliccare su zona di lancio:

.dz-max-files-reached { 
      pointer-events: none; 
      cursor: default; 
} 

di credito: questo answer

1

È possibile limitare il numero di file caricati, modificando in dropezone.js

Dropzone.prototype.defaultOptions = { maxFiles: 10, }

0

È anche possibile aggiungere in callbac ks - qui sto usando Dropzone per angolare

dzCallbacks = { 
    'addedfile' : function(file){ 
     $scope.btSend = false; 
     $scope.form.logoFile = file; 
    }, 
    'success' : function(file, xhr){ 
     $scope.btSend = true; 
     console.log(file, xhr); 
    }, 
    'maxfilesexceeded': function(file) { 
     $timeout(function() { 
      file._removeLink.click(); 
     }, 2000); 
    } 
} 
0

soluzione alternativa che ha funzionato molto bene per me:

init: function() { 
    this.on("addedfile", function(event) { 
     while (this.files.length > this.options.maxFiles) { 
      this.removeFile(this.files[0]); 
     } 
    }); 
} 
Problemi correlati