我可以使用 multer 和单个 html 表单在不同的文件夹中上传多个文件吗?
CanI upload many files in different folder using multer and a single html form?
我正在尝试开发一个应该从单个 html 表单上传文件的模块。
想象一个包含两个文件的表单:
1) 用户头像;
2) 简历相同的用户。
我会在 /avatar 中上传第一个文件,在 /cv 中上传第二个文件。
我可以用这三种方法来做:
.array('input file name');
.fields([{ name: 'avatar'},
{ 姓名:'curriculum'}]);
.任何()
第一个接受很多文件,但它必须具有相同的字段名称;
第二个接受很多文件,它可以传递名称(我认为这对我来说应该是正确的道路);
第三个接受我在 html 表单上设置的所有文件的所有名称。
好吧,它很好用,但问题是我不知道如何为每个文件设置不同的文件夹!
最后一次试用是:
app.route('/upload').post(.upload(fileObj1).array('avatar'),upload(fileObj2).array('curriculum'),function (request, response, next) {
但是 returns:
Error: Unexpected field
The problem isn't in other parts of code because if I launch this
code:
app.route('/upload').post(.upload(fileObj1).array('avatar'),function
(request, response, next) {
传递单个文件它工作正常!
有人可以帮助我吗?
我自己解决了!
这是我不完美的解决方案(它适用于目标、文件名和文件类型,但不适用于最大大小和文件)但是,我想分享我的代码:
在 app.js 我创建了一个这样的对象:
变量对象={
目的地:{input-name1:'./uploads', input-name:'./uplds'},
文件名:{ input-name1:'file1', input-name2:'file2'},
FieldNameSize:undefined,
fieldSize:undefined,
fields:undefined,
文件大小:{输入名称1:2*1024*1024,输入名称2:10*1024*1024},
文件:{input-name1:3,input-name2:1},
parts:undefined,
文件类型:{input-name1:"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 限制 = {};
for(输入obj)
{
开关(键){
案例'destination':
storage.destination=函数(请求,文件,cb){
cb(null,obj.destination[file.fieldname]);
};
休息;
案例'filename':
storage.filename=函数(请求,文件,cb){
如果(obj.filename[file.fieldname]!=未定义)
{
名称=obj.filename[file.fieldname];
如果(名字==未定义)
名称=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;
案例'FieldNameSize':
limits.fieldNameSize = 函数(请求、文件、cb){
如果(obj.fieldNameSize[file.fieldname]!=未定义)
cb(null,obj.fieldNameSize[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'fieldSize':
limits.fieldSize=函数(请求,文件,cb){
如果(obj.fieldSize[file.fieldname]!=未定义)
cb(null,obj.fieldSize[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'fields':
limits.fields = 函数(请求、文件、cb){
如果(obj.fields[file.fieldname]!=未定义)
cb(null,obj.fields[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'fileSize':
limits.fileSize = 函数(请求、文件、cb){
如果(obj.fileSize[file.fieldname]!=未定义)
cb(null,obj.fileSize[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'files':
limits.files = 函数(请求、文件、cb){
如果(obj.files[file.fieldname]!=未定义)
cb(null,obj.files[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'parts':
limits.parts = 函数(请求、文件、cb){
如果(obj.parts[file.fieldname]!=未定义)
cb(null,obj.parts[file.fieldname]);
否则 return cb(null, true);
};
休息;
案例'filetypes':
upld.fileFilter=函数(请求,文件,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());
如果 (mimetype && extname ) {return cb(null, true); }
cb("Sono Accettate solo le seguenti estensioni: " + obj.filetypes[file.fieldname]);
}
否则 return cb(null, true);
};
休息;
}
}
如果(storage.filename==未定义)
storage.filename=函数(请求,文件,cb){
nome=file.originalname.split('/').pop().trim();
cb(null, Date.now()+"_"+nome);
};
如果(limits.fileSize==未定义)
limits.fileSize=默认最大尺寸;
/*
var maxSize=l.maxSize;
limitsfileSize=函数(请求,文件,cb){
if(file.size>(maxSize)) { cb(null,true); }
else { cb("Il file non può pesare più di"+maxSize+" MB" ); }
};
*/
upld.storage= multer.diskStorage(存储);
upld.limits=限制;
return multer(upld).any();
};
我正在尝试开发一个应该从单个 html 表单上传文件的模块。
想象一个包含两个文件的表单:
1) 用户头像;
2) 简历相同的用户。
我会在 /avatar 中上传第一个文件,在 /cv 中上传第二个文件。
我可以用这三种方法来做:
.array('input file name');
.fields([{ name: 'avatar'},
{ 姓名:'curriculum'}]); .任何()
第一个接受很多文件,但它必须具有相同的字段名称;
第二个接受很多文件,它可以传递名称(我认为这对我来说应该是正确的道路);
第三个接受我在 html 表单上设置的所有文件的所有名称。
好吧,它很好用,但问题是我不知道如何为每个文件设置不同的文件夹!
最后一次试用是:
app.route('/upload').post(.upload(fileObj1).array('avatar'),upload(fileObj2).array('curriculum'),function (request, response, next) {
但是 returns:
Error: Unexpected field
The problem isn't in other parts of code because if I launch this code: app.route('/upload').post(.upload(fileObj1).array('avatar'),function (request, response, next) {
传递单个文件它工作正常! 有人可以帮助我吗?
我自己解决了! 这是我不完美的解决方案(它适用于目标、文件名和文件类型,但不适用于最大大小和文件)但是,我想分享我的代码:
在 app.js 我创建了一个这样的对象:
变量对象={ 目的地:{input-name1:'./uploads', input-name:'./uplds'}, 文件名:{ input-name1:'file1', input-name2:'file2'}, FieldNameSize:undefined, fieldSize:undefined, fields:undefined, 文件大小:{输入名称1:2*1024*1024,输入名称2:10*1024*1024}, 文件:{input-name1:3,input-name2:1}, parts:undefined, 文件类型:{input-name1:"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 限制 = {}; for(输入obj) { 开关(键){ 案例'destination': storage.destination=函数(请求,文件,cb){ cb(null,obj.destination[file.fieldname]); }; 休息; 案例'filename': storage.filename=函数(请求,文件,cb){ 如果(obj.filename[file.fieldname]!=未定义) { 名称=obj.filename[file.fieldname]; 如果(名字==未定义) 名称=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;
案例'FieldNameSize': limits.fieldNameSize = 函数(请求、文件、cb){ 如果(obj.fieldNameSize[file.fieldname]!=未定义) cb(null,obj.fieldNameSize[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'fieldSize': limits.fieldSize=函数(请求,文件,cb){ 如果(obj.fieldSize[file.fieldname]!=未定义) cb(null,obj.fieldSize[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'fields': limits.fields = 函数(请求、文件、cb){ 如果(obj.fields[file.fieldname]!=未定义) cb(null,obj.fields[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'fileSize': limits.fileSize = 函数(请求、文件、cb){ 如果(obj.fileSize[file.fieldname]!=未定义) cb(null,obj.fileSize[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'files': limits.files = 函数(请求、文件、cb){ 如果(obj.files[file.fieldname]!=未定义) cb(null,obj.files[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'parts': limits.parts = 函数(请求、文件、cb){ 如果(obj.parts[file.fieldname]!=未定义) cb(null,obj.parts[file.fieldname]); 否则 return cb(null, true); }; 休息; 案例'filetypes': upld.fileFilter=函数(请求,文件,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()); 如果 (mimetype && extname ) {return cb(null, true); } cb("Sono Accettate solo le seguenti estensioni: " + obj.filetypes[file.fieldname]); } 否则 return cb(null, true); }; 休息; } } 如果(storage.filename==未定义) storage.filename=函数(请求,文件,cb){ nome=file.originalname.split('/').pop().trim(); cb(null, Date.now()+"_"+nome); }; 如果(limits.fileSize==未定义) limits.fileSize=默认最大尺寸; /* var maxSize=l.maxSize; limitsfileSize=函数(请求,文件,cb){ if(file.size>(maxSize)) { cb(null,true); } else { cb("Il file non può pesare più di"+maxSize+" MB" ); } }; */ upld.storage= multer.diskStorage(存储); upld.limits=限制;
return multer(upld).any();
};