Utiliser Multer dans Express Route? (Utilisation de MEANJS)

J'utilise Multer pour télécharger des images dans Express 4. Cependant, tous les exemples montrent que Multer est défini dans le fichier express comme Middleware. Je voudrais réellement définir certains des comportements de Multer dans mon routage d'application. Est-ce possible? Le résultat final dont j'ai besoin est que ma fonction de route reconnaisse lorsque le téléchargement est terminé avant d'envoyer la réponse du serveur au navigateur, de sorte qu'une image peut être affichée à l'utilisateur (en ce moment, je n'obtiens qu'une image partielle affichée parce que Le fichier n'a pas encore fini de télécharger).

COURANT, CODE DE TRAVAIL

Express.js

// Require Multer as module dependency. var multer = require('multer'); // Using Multer for file uploads. app.use(multer({ dest: './public/profile/img/', limits: { fieldNameSize: 50, files: 1, fields: 5, fileSize: 1024 * 1024 }, rename: function(fieldname, filename) { return filename; }, onFileUploadStart: function(file) { if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') { return false; } } })); 

Server_routes.js

 app.route('/users/image').post(server_controller_file.imageUpload); 

Server_controller_file.js

 exports.imageUpload = function(req, res) { // Check to make sure req.files contains a file, mimetypes match, etc., then send appropriate server response. }; 

Idéalement, mon serveur_controller_file.js contiendrait quelques vérifications pour s'assurer que le fichier a fini de télécharger, par exemple (note: ceci est hypothétique / souhaitable, pas un code de travail réel) …

 var multer = require('multer'); exports.imageUpload = function(req, res) { multer({ onFileUploadComplete: function(file) { res.send(); } }); } 

Encore une fois, en ce moment, la nature asynchique du nœud provoque le fait que le navigateur pense que le téléchargement est terminé dès qu'il reçoit une réponse réussie, alors, lorsque je met à jour l'url pour afficher l'image, il ne s'affiche que partiellement. Merci pour l'aide!

En fait, vous pouvez faire ce que vous voulez avec une autre méthode:

 var express = require('express'); var multer = require('multer'); var upload = multer({ dest: './uploads/'}); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); // accept one file where the name of the form field is named photho app.post('/', upload.single('photho'), function(req, res){ console.log(req.body); // form fields console.log(req.file); // form files res.status(204).end(); }); app.listen(3000); 

D'accord, j'ai fini par écrire les données brutes. Si vous définissez inMemory sur true , il envoie les données brutes à req.files.file.buffer. Voici la solution de travail finale:

Express.js

 // Using Multer for file uploads. app.use(multer({ dest: './public/profile/img/', limits: { fieldNameSize: 50, files: 1, fields: 5, fileSize: 1024 * 1024 }, rename: function(fieldname, filename) { return filename; }, onFileUploadStart: function(file) { console.log('Starting file upload process.'); if(file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png') { return false; } }, inMemory: true //This is important. It's what populates the buffer. })); 

Server_controller_file.js

 exports.imageUpload = function(req, res) { var file = req.files.file, path = './public/profile/img/'; // Logic for handling missing file, wrong mimetype, no buffer, etc. var buffer = file.buffer, //Note: buffer only populates if you set inMemory: true. fileName = file.name; var stream = fs.createWriteStream(path + fileName); stream.write(buffer); stream.on('error', function(err) { console.log('Could not write file to memory.'); res.status(400).send({ message: 'Problem saving the file. Please try again.' }); }); stream.on('finish', function() { console.log('File saved successfully.'); var data = { message: 'File saved successfully.' }; res.jsonp(data); }); stream.end(); console.log('Stream ended.'); }; 

Je trouve un exemple pour busboy:

 exports.upload = function (req, res, next) { req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { // .... }); req.pipe(req.busboy); }; 

Multer est également pipe busboy:

  req.pipe(busboy); 

https://github.com/expressjs/multer/blob/master/index.js#206