2014-07-23 17 views
5

Ho un problema con il caricamento di più file nella mia app di vele. Sto cercando di implementare più file caricati con Dropzone.js e il mio backend è Sails v0.10.0-rc8.Caricamento di più file con Sails.js 0.10 e Skipper utilizzando Dropzone.js

Ora quando carico alcuni file tramite dropzone, vedo che in caso di upload multiplo invia i file con parametri separati nella richiesta. I nomi dei parametri sono 'photo[0]', 'photo[1]', 'photo[2]',.... Io sono sempre i file di controllo in questo modo:

req.file(file).upload(function (err, files) { 

    // save the file 

}); 

Ma quando c'è più di un file inviato, la richiesta viene passato al controller prima che tutti i file vengono analizzati e memorizzati dalla richiesta, in modo da ottenere un solo file nel mio controller.

Qualcuno ha riscontrato questo problema? Forse non c'è supporto per il caricamento di più file con parametri di richiesta diversi nel parser di body skipper? Perché quando invio diversi file all'interno di un attributo ('foto'), tutti vengono gestiti e passati al controller.

+0

Questo codice è contenuto in un ciclo di qualche tipo? L'argomento di 'req.file' è il parametro con il quale il file è stato inviato, e nel tuo caso i file sono tutti inviati usando parametri diversi, quindi è ovvio che il' .upload 'risulterebbe in un solo file che viene restituito . In realtà non so se più chiamate a 'req.file' funzioneranno, ma prima di tutto chiariamo se ci state provando o meno. – sgress454

+0

sì, c'è un ciclo con tutti i possibili nomi di file che ho – ArVan

risposta

7

Questo dovrebbe funzionare, a patto di scorrere i nomi param in modo asincrono, per es .:

async.map(paramNames, function(file, cb) { 

    req.file(file).upload(function (err, files) { 

     // save the file, and then: 
     return cb(err, files); 

    }); 

}, function doneUploading(err, files) { 

     // If any errors occurred, show server error 
     if (err) {return res.serverError(err);} 
     // Otherwise list files that were uploaded 
     return res.json(files); 

}); 

ho avuto modo di testare questo successo.

+0

Grazie, ci proverò. – ArVan

+0

Hmm ... Ho finito con l'uso di 'async.eachSeries' mentre eseguivo alcune altre cose dopo ogni salvataggio di file, e ha funzionato per me. Grazie per aver ricordato async;) – ArVan

+0

Puoi condividere il codice? –

1

Questo sembra funzionare bene per me:

Dropzone.options.fotagDropzone = { 
    init: function() { 

    this.on("success", function(file, responseText) { 
    // Handle the responseText here. For example, add the text to the preview element: 
    console.log(responseText.files[0]); 
    file.previewTemplate.appendChild(document.createTextNode(responseText.files[0].fd)); 
    }); 

    }, 
    paramName: "file", // The name that will be used to transfer the file 
    maxFilesize: 10, // MB 
    uploadMultiple: false, 
    addRemoveLinks: true, 
    parallelUploads: true, 
    dictDefaultMessage: 'Drag files here <br />or<br /><button class="dzUploadBtn" type="button">click here to upload</button>', 
    acceptedMimeTypes: '.jpg' 
    }; 

In sostanza, non invia i file tutti insieme, ma è ancora possibile eliminare più file in zona di lancio. Il back-end è il tuo upload standard usando skipper.

0

Con Dropzone e Sails.js, bisogna:

  • aggiungere il definination del nome del file di configurazione in zona di lancio:

Dropzone.options.myDropzone = { paramName: "nomefile" }

  • uso questo comando per recuperare il file caricato:

req.file ('filename') caricare (function (Err, uploadedFiles) {

}).;

uploadedFiles contiene il file