说明
multer是express官方推荐的文件上传中间件,它是在busboy的基础上开发的。目前multer的最新版本为:~1.1.0。 本文所有代码段均使用此版本。 multer的官方地址:GitHub
配置
在nodejs下的package.json中添加multer依赖,运行加载依赖库。 新建multerUtil.js,
var multer=require('multer');
var storage = multer.diskStorage({
//设置上传后文件路径,uploads文件夹会自动创建。
destination: function (req, file, cb) {
cb(null, './public/uploads')
},
//给上传文件重命名,获取添加后缀名
filename: function (req, file, cb) {
var fileFormat = (file.originalname).split(".");
cb(null, file.fieldname + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]);
}
});
//添加配置文件到muler对象。
var upload = multer({
storage: storage
});
//如需其他设置,请参考multer的limits,使用方法如下。
//var upload = multer({
// storage: storage,
// limits:{}
// });
//导出对象
module.exports = upload;
使用
testController.js
var muilter = require('./multerUtil');
//multer有single()中的名称必须是表单上传字段的name名称。
var upload=muilter.single('file');
exports.dataInput = function (req, res) {
upload(req, res, function (err) {
//添加错误处理
if (err) {
return console.log(err);
}
//文件信息在req.file或者req.files中显示。
console.log(req);
});
}
app.js
var testController=require('./testController');
app.post('/dataInpute',testController.dataInput);
其他说明
1.文件上传有以下方法
- muilter.single(‘file’), //适用于单文件上传
- muilter.array(‘file’,num), //适用于多文件上传,num为最多上传个数,上传文件的数量可以小于num,
- muilter.fields(fields), //适用于混合上传,比如A类文件1个,B类文件2个。官方API有详细说明。
2.file为上传字段名称,当使用form表单submit方式上传时,必须与表单上传的name属性保持一致。 表单记得加上 enctype=‘multipart/form-data’
3.对上传文件大小限制,名称限制等均可在limits中加上,具体可加属性,请参考官方api。
在网上搜索的其他资料大部分都版本较老,所以重新整理一下,希望对大家能有所帮助,如本人理解不正确或使用方法不当,还请多多指教。
排版,格式调了好久都没调好,,哭~
@Chen-xy 兄弟,去学一下markdown写法,我帮你编辑了一下,你可以自己编辑一下看看
总结的还不错,继续加油
Mark 自豪地采用 CNodeJS ionic
还有个 any()
方法
@i5ting 谢谢,现在看着清晰多了~
@yinzSE 是的,这个是当前最新版的,版本号~1.1.0。
mk
文件能上传,但是testController.dataInput进不去,如果空文件提交的话可以进去,不知道啥原因
mark
1.destination 无法自动生成路径啊,Error: ENOENT: no such file or directory destination:function(req,file,cb){ cb(null,’./uploads/images’) }, 2.var upload = multer({ dest: ‘uploads/’}); 默认保存dest. 文件后缀名会消失怎么处理呢。
@i5ting 靠,大神,哪都有你,也多给我指导指导呐,谢谢啦
第一个问题
destination 参数可以传递一个函数也可以传递一个字符串,传递函数时,你要自己建立上传文件夹,multer不会给你创建的;如果传递字符串参数,multer会给你自动创建一个文件夹的。你传递的是函数,所以你要自己创建对应的文件夹。
第二个问题
multer为了避免命名的冲突,默认随机产生一个文件名且不添加文件后缀的,可以使用diskstorage获取原文件名。下面是我的代码: var multer = require(‘multer’); var storage = multer.diskStorage({ destination: function (req, file, cb){ cb(null, ‘./public/images’); }, filename: function (req, file, cb){ cb(null, file.originalname) } }); var upload = multer({ storage: storage });
其中,filename就是处理上传后文件的命名问题的。
@Chen-xy 请问除了表单提交,还有哪几种上传方式?
@TigerWFH 十分感谢~~ file.originalname可行。
DiskStorage The disk storage engine gives you full control on storing files to disk.
服务器收到上传文件后,怎样提醒前端页面上传成功呢?因为不是ajsx提交的所以我没有办法像ajax的success中收到服务器发来的json数据,这该怎么办呢?
@zhulinwei 如果不使用ajax,直接传参数给前台,通过渲染页面的方式。
现在可以获取进度了吗
蛮好用,不错不错····
multer不太好用, 推荐你用 formidable
@qingmingsang 可以获取进度吗?
@nnliang 可以
nice
good
怎么用jq的ajax上传?
@zhulinwei 同问呀。我都是重定向到另一个页面