nodejs中的中间件--Multer

中间件Multer

Multer是nodejs中处理multipart/form-data数据格式(主要用在上传功能中)的中间件。该中间件不处理multipart/form-data数据格式以外的任何形式的数据
Tips:multipart/form-data是用来指定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或者mp3等等
* 安装方法

$ npm install --save multer
  • API

文件信息(file information):上传后的文件具有如下属性
fieldname: 上传文件标签在表单中的name
originalname:文件在用户电脑上的文件名
Encoding:该文件的编码
mimetype:该文件的Mime type
size:该文件的字节数
destination:该文件要保存的文件夹
filename:在保存的文件夹下的文件名
path:文件上传后保存的完整路径
buffer:完整文件的buffer

multer(opts)
multer可以传入一个可选参数,一般该参数为dest属性,规定上传文件存放的位置。如果该参数省略,上传的文件将一直保存在内存中,永远不会写进磁盘。
默认情况下,Multer将会重命名上传的文件,以免文件名的冲突。重命名的方法可以根据需要个性化编写。

下面的属性是Multer的可选参数
dest or storage: 上传的文件所存放的位置
fileFilter:过滤什么文件可以上传的方法
limits:限制上传文件的大小

在一般的软件开发中,一般只有dest是需要设定的,设定方法如下

var upload = multer({ dest: 'uploads/' })

如果想对上传的文件有更多的要求,可以使用storage参数。

var  multer=require('multer');
var storage = multer.diskStorage({

 //设置上传后文件路径
    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]);
  }
 });  
 //添加配置文件到multer对象。
 var upload = multer({
      storage: storage
});

.single(fieldname)
该方法接收单个上传的文件 fieldname为上传文件所用的标签name属性。上传的文件信息存储在req.file中

.array(fieldname[, maxCount])
该方法可以接收多个文件,参数为所有的上传文件所用标签的name属性。如果文件数量超过maxCount所规定的最大数量,会报错。上传的文件存储在req.files中

.fields(fields)

该方法可以接收由fields指定的不同类型的文件。多个文件对象被保存在req.files中。fields是由name和maxCount属性组成的json对象数组。例如

[
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]

.any()

允许接收导线传来的任何文件。文件将被存储在req.files中。

storage

DiskStorage:disk storage engine可以控制存储文件到磁盘的操作

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 })

有两个可选参数:destination和filename。这是两个规定文件如何保存的方法。
destination用来规定上传的文件保存的文件夹。该参数也可以通过字符串形式给出(如’tmp/uploads’)

filename用来规定文件保存到相应文件夹后的文件名。如果filename未给定,上传的文件将会随机分配一个文件名,但是该文件没有扩展名
注意: Multer不会自动为文件添加扩展名,所有filename方法中需要返回带有文件扩展名的完整文件名

MemoryStorage
memory storage engine 将在内存中的文件存储为Buffer对象。

var storage = multer.memoryStorage()
var upload = multer({ storage: storage })

当使用memory storage,文件信息(file infomation)将会有buffer属性,该属性保存着完整的文件
注意:当一次性或短时间内上传非常大的文件,或者上传非常多的文件时,可能会引起应用程序占满内存。

limit
通过如下可选参数定义上传文件的大小限制

关键词 描述 默认
fieldNameSize field name的最大字节值 100bytes
fieldSize field的最大字节值 1MB
fields 非文件fields的最大数量 Infinity
fileSize For multipart forms 文件的最大字节 Infinity
files For multipart forms file fields 的最大数量 Infinity
parts For multipart forms (fields + files) 的最大数量 Infinity

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
如果需要获取错误信息,可以通过中间件函数获取

app.post('/profile', function (req, res) {
  upload(req, res, function (err) {
    if (err) {
      // An error occurred when uploading
      return
    }

    // Everything went fine
  })
})
  • 基本用法

    var express = require('express');
    var multer  = require('multer');
    var upload = multer({ dest: 'uploads/' });//设置文件上传后的保存路径
    var app = express();
    app.post('/profile', upload.single('avatar'), function (req, res, next) {
    
    // req.body will hold the text fields, if there were any
    })
    
    app.post('/photos/upload', upload.array('photos', 12),      function (req, res, next) {
    
     // req.body will contain the text fields, if there were any
    })
    
      var cpUpload = upload.fields([{ name: 'avatar',     maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
     app.post('/cool-profile', cpUpload, function (req, res, next) {
     // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files
     //
    // e.g.
    //  req.files['avatar'][0] -> File
    //  req.files['gallery'] -> Array
    //
    // req.body will contain the text fields, if there were any
    })
    

参看文献:Multer

你可能感兴趣的:(nodeJS)