我正在尝试开发一个应该从单个html表单上传文件的模块。
想象一下包含两个文件的表单:
1)用户的化身;
2)同一用户的简历。
我会将第一个文件上传到/ avatar,将第二个文件上传到/ cv。
我可以使用这三种方法:
.array('input file name');
.fields([{ name: 'avatar'},
{name:'curriculum'}]); 。任何()
第一个接受许多文件,但它必须具有相同的字段名称;
第二个接受许多文件,它可以传递名称(我认为这应该是正确的道路);
第三个接受我在html表单上设置的所有文件的所有文件。
好吧,它工作得很好,但问题是我不知道如何为每个文件设置不同的文件夹!
最后一次试验是:
app.route('/upload').post(.upload(fileObj1).array('avatar'),upload(fileObj2).array('curriculum'),function (request, response, next) {
但它返回:
错误:意外字段
问题不在代码的其他部分,因为如果我启动它 码: app.route( '/上传')。后(.upload(fileObj1).array( '阿凡达'),函数 (请求,响应,下一个){
传递单个文件,它正常工作! 有人可以帮帮我吗?
答案 0 :(得分:-1)
我解决了自己! 这是我不完美的解决方案(它适用于目标,文件名和文件类型,但不适用于maxsize和文件)但是,我想分享我的代码:
在app.js中的我创建了一个这样的对象:
var obj = { destination:{input-name1:'。/ uploads',input-name:'。/ uplds'}, filename:{input-name1:'file1',input-name2:'file2'}, FieldNameSize:未定义, 字段大小:未定义, 田:未定义, fileSize:{input-name1:2 * 1024 * 1024,input-name2:10 * 1024 * 1024}, 文件:{输入名1:3,输入NAME2:1}, 部分:不确定, 文件类型:{输入名1: “JPEG,JPG”} };
并在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) { 开关(键){ 案例'目的地': storage.destination = function(request,file,cb){ CB(NULL,obj.destination [file.fieldname]); }; 打破; 案例'文件名': storage.filename = function(request,file,cb){ 如果(obj.filename [file.fieldname]!=未定义) { 诺姆= obj.filename [file.fieldname]; 如果(诺姆==未定义) nome = file.originalname.substring(0,file.originalname.lastIndexOf(“。”));
nome+=file.originalname.substring(file.originalname.lastIndexOf('.'),file.originalname.length);
} else nome = file.originalname.split('/')。pop()。trim();
cb(null, nome);
};
break;
case'FieldNameSize': limits.fieldNameSize = function(request,file,cb){ 如果(obj.fieldNameSize [file.fieldname]!=未定义) CB(NULL,obj.fieldNameSize [file.fieldname]); else返回cb(null,true); }; 打破; case'fieldSize': limits.fieldSize = function(request,file,cb){ 如果(obj.fieldSize [file.fieldname]!=未定义) CB(NULL,obj.fieldSize [file.fieldname]); else返回cb(null,true); }; 打破; 案例'字段': limits.fields = function(request,file,cb){ 如果(obj.fields [file.fieldname]!=未定义) CB(NULL,obj.fields [file.fieldname]); else返回cb(null,true); }; 打破; case'fileSize': limits.fileSize = function(request,file,cb){ 如果(obj.fileSize [file.fieldname]!=未定义) CB(NULL,obj.fileSize [file.fieldname]); else返回cb(null,true); }; 打破; 案件'档案': limits.files = function(request,file,cb){ 如果(obj.files [file.fieldname]!=未定义) CB(NULL,obj.files [file.fieldname]); else返回cb(null,true); }; 打破; 案例'部分': limits.parts = function(request,file,cb){ 如果(obj.parts [file.fieldname]!=未定义) CB(NULL,obj.parts [file.fieldname]); else返回cb(null,true); }; 打破; case'filetypes': upld.fileFilter = function(req,file,cb){ 如果(obj.filetypes [file.fieldname]!=未定义){ 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返回cb(null,true); }; 打破; } } 如果(storage.filename ==未定义) storage.filename = function(request,file,cb){ 。诺姆= file.originalname.split( '/')POP()修剪(); cb(null,Date.now()+“_”+ nome); }; 如果(limits.fileSize ==未定义) limits.fileSize = defaultMaxSize; / * var maxSize = l.maxSize; limitsfileSize = function(request,file,cb){ if(file.size>(maxSize)){cb(null,true); } else {cb(“Il filenonpuòpearepiùdi”+ maxSize +“MB”); } }; * / upld.storage = multer.diskStorage(storage); upld.limits =极限;
return multer(upld).any();
};