nodejs之express中间件multer实现附件上传

参考使用:http://blog.csdn.net/devil13th/article/details/50404351

github地址expressjs/multerhttps://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的参数

keydescription
dest or storageWhere to store the files
fileFilterFunction to control which files are accepted
limitsLimits of the uploaded data

如果是dest,后面跟的是要上传到服务器的存储路径,例如:'uploads/'

如果是storage,就需要用下面的方法:

DiskStorage你可以使用硬盘存储模式设置在哪里存放上传的附件
  1. var storage = multer.diskStorage({  
  2.   destination: function (req, file, cb) {  
  3.     cb(null'/tmp/my-uploads')  
  4.   },  
  5.   filename: function (req, file, cb) {  
  6.     cb(null, file.fieldname + '-' + Date.now())  
  7.   }  
  8. })  
  9.    
  10. 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属性中(是一个对象数组),配置参数如下

[
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]
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

设置什么种类的文件可以上传,什么种类的文件被跳过,例如

  1. function fileFilter (req, file, cb) {  
  2.    
  3.   // The function should call `cb` with a boolean   
  4.   // to indicate if the file should be accepted   
  5.    
  6.   // To reject this file pass `false`, like so:   
  7.   cb(nullfalse)  
  8.    
  9.   // To accept the file pass `true`, like so:   
  10.   cb(nulltrue)  
  11.    
  12.   // You can always pass an error if something goes wrong:   
  13.   cb(new Error('I don\'t have a clue!'))  
  14.    

 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;
            //具体操作
        });
    });
}) ;



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值