参考使用:http://blog.csdn.net/devil13th/article/details/50404351
github地址/multer:https://github.com/expressjs/multer
multer是express官方推荐的文件上传中间件,multer是Nodejs中用于处理文件上传 multipart/form-data数据的中间件,用于处理任何表单提交数据(包含非multipart/form-data类型的表单);
multer 在request对象中加入了body和file或files属性,body属性包含了form中的文本内容,file或files包含了form 中的附件数据;
var upload = multer({ dest: 'uploads/' })下面是multer的参数
key | description |
---|---|
dest or storage | Where to store the files |
fileFilter | Function to control which files are accepted |
limits | Limits of the uploaded data |
如果是dest,后面跟的是要上传到服务器的存储路径,例如:'uploads/';
如果是storage,就需要用下面的方法:
DiskStorage你可以使用硬盘存储模式设置在哪里存放上传的附件
- var storage = multer.diskStorage({
- destination: function (req, file, cb) {
- cb(null, '/tmp/my-uploads')
- },
- filename: function (req, file, cb) {
- cb(null, file.fieldname + '-' + Date.now())
- }
- })
- var upload = multer({ storage: storage })
var upload = multer({ storage: Storage }).array("imgUploader", 3);
upload的方法:
.single(fieldname)接收一个叫做fieldname名字的附件,该附件将被保存到req.file属性中
.array(fieldname[, maxCount])
接收一个名字叫fieldname的附件数组(数组中有多个附件),如果附件的数量大于maxCountfiles则抛出异常。文件数组将被储存到req.files属性中。
.fields(fields)
接收所有的附件,附件将被保存到req.files属性中(是一个对象数组),配置参数如下
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
console.log(req.file);//Form中的附件
console.log(req.body);//Form中的文本
})
.any()接收所有提交的数据,保存到req.files属性中
fileFilter
设置什么种类的文件可以上传,什么种类的文件被跳过,例如
- function fileFilter (req, file, cb) {
- // The function should call `cb` with a boolean
- // to indicate if the file should be accepted
- // To reject this file pass `false`, like so:
- cb(null, false)
- // To accept the file pass `true`, like so:
- cb(null, true)
- // You can always pass an error if something goes wrong:
- cb(new Error('I don\'t have a clue!'))
- }
Error handling---如果需要专门从multer获取错误,就需要自己写中间件获取错误
当上传过程出现错误,multer将把错误信息发送给express,你可以做一个显示错误的界面。如果你希望从multer获取错误,你可以调用你自己写的中间件
var upload = multer().single('avatar')
app.post('/profile', function (req, res) {
upload(req, res, function (err) {
if (err) {
// An error occurred when uploading
return
}
// Everything went fine
})
})
=============实例1========
//加入express 和 multer模块
npm install express --save
npm install multer --save
*********app.js***********
var express = require('express');
var app = express();//创建express实例
var routes=require('./routes/routes.js');//吧路由引入; ./ 代表项目的当前总目录 /Users/wofu/Desktop/node
routes.router(app);//调用路由
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log(__dirname);//这里的目录就是/Users/wofu/Desktop/node,其中node文件夹我是直接放在了桌面
console.log(host);//主机地址
console.log(port);//端口号
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
*************routes**************
var router = function(app){
var fs = require("fs");
var bodyParser = require('body-parser');
//引入multer模块 ,是上传附件的一个中间件
// multer是Nodejs中用于处理文件上传 multipart/form-data数据的中间件,
// 用于处理任何表单提交数据(包含非multipart/form-data类型的表单);
// multer 在request对象中加入了body和file或files属性,body属性包含了form中的文本内容,
// file或files包含了form 中的附件数据;
每个文件包含以下信息:
fieldname:在窗体中指定的字段名
originalname:用户计算机上文件的名称
encoding:文件的编码类型
mimetype:文件的MIME类型
size:文件的大小(以字节为单位)
destination:保存文件的文件夹
filename:目标文件的名称
path:上传文件的完整路径
buffer:整个文件的Buffer
var multer = require ('multer');//设置上传的目录,//这里指定了一个临时目录(上传后的文件均保存到该目录下),//真正开发是一般加入path模块后使用path.join(__dirname,'temp');
var upload = multer({ dest: "/Users/wofu/Desktop/node/temp" ,//服务器上存放的位置,设置上传的目录,
limits:{ // 设定限制,每次最多上传1个文件,文件大小不超过1MB
fileSize: 1000000,
files:1
}});
//显示HTML网页
app.get('/one', function (req, res) {
res.sendFile("/Users/wofu/Desktop/node/views" + "/" + "one.html" );//显示静态网页
})
//单个件上传---HTML文件中点击提交按钮触发action:singleUpload//注意上传界面中的 <input type="file" name="avatar"/>中的name必须是下面代码中指定的名称
app.post('/singleUpload', upload.single('avatar'), function (req, res, next) {
console.log(req.file);//Form中的附件
console.log(req.body);//Form中的文本
//上传后的结果如下
//{ fieldname: 'avatar',---form 表单中的name属性
// originalname: '图标@2x.png',----上传的原始图片名
// encoding: '7bit',---编码方式,可以在前面设置
// mimetype: 'image/png',---文件类型
// destination: '/Users/wofu/Desktop/node/temp',------服务器存储的路径
// filename: '1ab8ac748ace8c68f596278070b45f75',----上传到服务器后的文件名,系统自动生成,需要自己更改
// path: '/Users/wofu/Desktop/node/temp/1ab8ac748ace8c68f596278070b45f75',----文件在服务器中的路径
// size: 3346 }--------大小
// { aaaa: 'hhh', bbb: 'aaa' }----Form表单提交的文本框中的内容
res.end("上传成功");
});
//多附件上传---HTML文件中点击提交按钮触发action:mulUpload
//注意上传界面中的 <input type="file" name="photos"/>中的name必须是下面代码中指定的名
app.post('/mulUpload', upload.array('photos', 12), function (req, res, next) {
console.log(req.files); console.log(req.body);
//多文件上传返回的结果
[ { fieldname: 'photos',
// originalname: '理财选中@2x.png',
// encoding: '7bit',
// mimetype: 'image/png',
// destination: '/Users/wofu/Desktop/node/temp',
// filename: '45d788a5dab3d7073d76d4897b421af7',
// path: '/Users/wofu/Desktop/node/temp/45d788a5dab3d7073d76d4897b421af7',
// size: 1600 },
// { fieldname: 'photos',
// originalname: '图标@2x.png',
// encoding: '7bit',
// mimetype: 'image/png',
// destination: '/Users/wofu/Desktop/node/temp',
// filename: '9b39721887abab09dd6d138b8a8d1968',
// path: '/Users/wofu/Desktop/node/temp/9b39721887abab09dd6d138b8a8d1968',
// size: 3346 } ]
// { aaaa: '', bbb: '' }
res.end("aaaaa");
})};
exports.router = router;
**********one.html**********
//上传
<html>
<head>
<title>文件上传表单</title>
</head>
<body>
<h2>单个文件上传</h2>
<form action="/singleUpload" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" /><br/>
<input type="text" name="aaaa" /><br/>
<input type="text" name="bbb" /><br/>
<input type="submit" value="submit"/><br/>
</form>
<hr/>
<h2>多文件上传</h2>
<form action="/mulUpload" method="post" enctype="multipart/form-data">
<input type="file" name="photos" /><br/>
<input type="file" name="photos" /><br/>
<input type="file" name="photos" /><br/>
<input type="text" name="aaaa" /><br/>
<input type="text" name="bbb" /><br/>
<input type="submit" value="submit"/><br/>
</form>
</body>
</html>
===============实例2========参考:http://cnodejs.org/topic/564f32631986c7df7e92b0db
新建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对象。
//如需其他设置,请参考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中加上
==============multiparty模块实现附件上传==============
multiparty官网地址:https://www.npmjs.com/package/multiparty
var express = require('express');
var router = express.Router();
var multiparty = require('multiparty');
var path = require('path');
var fs = require("fs");
router.post('/add',function(req,res,next){
// 解析一个文件上传
var form = new multiparty.Form();
//设置文件存储路径
form.uploadDir = "uploads/images/";
//设置单文件大小限制
form.maxFilesSize = 2 * 1024 * 1024;
//form.maxFields = 1000; 设置所以文件的大小总和
//解析表单数据
form.parse(req, function(err, fields, files) {
//fields:非文件内容;files:文件内容
console.log(files.originalFilename);
console.log(files.path);
//重命名文件名
fs.rename(oldPath,newPath,(err) => {
if (err) throw err;
//具体操作
});
});
}) ;