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