Filippo1980 Filippo1980 - 24 days ago 7x
Node.js Question

CanI upload many files in different folder using multer and a single html form?

I'm trying to develop a module that should upload files from a single html form.
Imagine a form that contains two files:

1) the avatar of the user;

2) the curriculum vitae the same user.

I would upload the first file in /avatar and the second in /cv.

I can use to do that three method:

.array('input file name');
.fields([{ name: 'avatar'},

{ name: 'curriculum'}]);
. any()

The first accepts many files but its must have the same fields name;

The second accepts many files and its can have the names passed (and I think it should be right road for me);

the third accepts all files all names I set on html form.
Well, its work well but the problem is that I don't know how set different folders for each file!

The last trial was:

app.route('/upload').post(.upload(fileObj1).array('avatar'),upload(fileObj2).array('curriculum'),function (request, response, next) {

but it returns:

Error: Unexpected field

The problem isn't in other parts of code because if I launch this
(request, response, next) {

passing a single file it works correctly!
Someone can help me?


I resolved myself! This is my not perfect solution (it works well for destination, filename and filetypes but not for maxsize and files) however, I want share my code:

in app.js I create an object like this:

var obj={ destination: {input-name1:'./uploads', input-name:'./uplds'}, filename: { input-name1:'file1', input-name2:'file2'}, FieldNameSize:undefined, fieldSize:undefined, fields:undefined, fileSize:{input-name1:2*1024*1024, input-name2:10*1024*1024}, files:{input-name1:3,input-name2:1}, parts:undefined, filetypes:{input-name1:"jpeg,jpg"} };

and in rules_upload.js:

var path = require('path'); var multer = require('multer'); var defaultMaxSize=3*1024*1024; var defaultFiles=1;

exports.upload = function (obj, next) { var upld = {}; var storage={}; var limits = {}; for (key in obj) { switch (key) { case 'destination': storage.destination= function (request, file, cb) { cb(null,obj.destination[file.fieldname]); }; break; case 'filename': storage.filename=function (request, file, cb) { if(obj.filename[file.fieldname]!=undefined) { nome=obj.filename[file.fieldname]; if(nome==undefined) nome=file.originalname.substring(0, file.originalname.lastIndexOf("."));


} else nome=file.originalname.split('/').pop().trim();

cb(null, nome);

case 'FieldNameSize': limits.fieldNameSize = function (request, file, cb) { if(obj.fieldNameSize[file.fieldname]!=undefined) cb(null,obj.fieldNameSize[file.fieldname]); else return cb(null, true); }; break; case 'fieldSize': limits.fieldSize= function (request, file, cb) { if(obj.fieldSize[file.fieldname]!=undefined) cb(null,obj.fieldSize[file.fieldname]); else return cb(null, true); }; break; case 'fields': limits.fields = function (request, file, cb) { if(obj.fields[file.fieldname]!=undefined) cb(null,obj.fields[file.fieldname]); else return cb(null, true); }; break; case 'fileSize': limits.fileSize = function (request, file, cb) { if(obj.fileSize[file.fieldname]!=undefined) cb(null,obj.fileSize[file.fieldname]); else return cb(null, true); }; break; case 'files': limits.files = function (request, file, cb) { if(obj.files[file.fieldname]!=undefined) cb(null,obj.files[file.fieldname]); else return cb(null, true); }; break; case 'parts': = function (request, file, cb) { if([file.fieldname]!=undefined) cb(null,[file.fieldname]); else return cb(null, true); }; break; case 'filetypes': upld.fileFilter= function (req, file, cb) { if(obj.filetypes[file.fieldname]!=undefined){ var f=obj.filetypes[file.fieldname]; f=f.replace(",","|"); var re= new RegExp(f); var mimetype = re.test(file.mimetype); var extname = re.test(path.extname(file.originalname).toLowerCase()); if (mimetype && extname ) {return cb(null, true); } cb("Sono Accettate solo le seguenti estensioni: " + obj.filetypes[file.fieldname]); } else return cb(null, true); }; break; } } if(storage.filename==undefined) storage.filename= function (request, file, cb) { nome=file.originalname.split('/').pop().trim(); cb(null,"_"+nome); }; if(limits.fileSize==undefined) limits.fileSize=defaultMaxSize; /* var maxSize=l.maxSize; limitsfileSize= function (request, file, cb) { if(file.size>(maxSize)) { cb(null,true); } else { cb("Il file non può pesare più di"+maxSize+" MB" ); } }; */ multer.diskStorage(storage); upld.limits=limits;

return multer(upld).any();