2014-07-23 12 views
5

Mam problem z przesyłaniem wielu plików w mojej aplikacji żagle. Próbuję zaimplementować przesyłanie wielu plików za pomocą Dropzone.js, a moim zapleczem jest Sails v0.10.0-rc8.Przesyłanie wielu plików za pomocą Sails.js 0.10 i Skipper za pomocą Dropzone.js

Teraz, gdy przesyłam niektóre pliki za pośrednictwem aplikacji Dropzone, widzę, że w przypadku wielokrotnego przesyłania wysyła pliki z oddzielnymi parametrami w żądaniu. Nazwy parametrów to 'photo[0]', 'photo[1]', 'photo[2]',.... Dostaję pliki sterownika tak:

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

    // save the file 

}); 

Ale gdy istnieje więcej niż jeden plik złożone, wniosek jest przekazywany do sterownika zanim wszystkie pliki są przetwarzane i przechowywane z zamówienie, więc mam tylko jeden plik w moim kontrolerze.

Czy ktoś napotkał ten problem? Być może nie ma obsługi wielokrotnego przesyłania plików z różnymi parametrami żądania w analizatorze treści szyfru? Ponieważ kiedy przesyłam kilka plików w jednym atrybucie ("zdjęcie"), wszystkie są obsługiwane i przekazywane do kontrolera.

+0

Czy ten kod jest zawarty w jakiejś pętli? Argument "req.file" jest parametrem, do którego plik został wysłany, a w twoim przypadku wszystkie pliki są wysyłane przy użyciu różnych paramów, więc oczywiste jest, że '.upload' spowodowałoby zwrócenie tylko jednego pliku . Właściwie nie wiem, czy wiele połączeń z 'req.file' będzie działało, ale najpierw wyjaśnij, czy próbujesz tego, czy nie. – sgress454

+0

Tak, istnieje pętla z wszystkimi możliwymi nazwami plików Mam – ArVan

Odpowiedz

7

To powinno działać, pod warunkiem, że pętlę poprzez nazw param asynchronicznie, np .:

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); 

}); 

udało mi się przetestować to z powodzeniem.

+0

Dzięki, spróbuję. – ArVan

+0

Hmm ... Skończyło się na używaniu 'async.eachSeries', tak jak robię inne rzeczy po każdym zapisaniu pliku i działało to dla mnie. Dzięki za przypomnienie o async;) – ArVan

+0

Czy możesz udostępnić kod? –

1

To wydaje się działać dobrze dla mnie:

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

Zasadniczo, to nie wysyła pliki wszyscy razem, ale nadal można upuścić kilka plików w zrzutowiska. Back-end to standardowe przesyłanie przy użyciu kapitana.

0

Z Dropzone i Sails.js, trzeba:

  • dodać Definination nazwy pliku w konfiguracji DropZone:

Dropzone.options.myDropzone = { ParamName: "FILENAME" }

  • użycie tego polecenia, aby wrócić przesłanego pliku:

req.file ('fileName') przesyłania (funkcja (ERR uploadedFiles) {

}.);

uploadedFiles zawiera plik