Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据, 它主要用于上传文件. 它是写在 busboy 之上非常高效。
注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据.
安装
1 | npm install --save multer |
使用
Multer 会添加一个 body 对象 以及 file 或 files 对象 到 request 对象中. body 对象包含表单的文本域信息, file 或 files 对象包含对象表单上传的文件信息.
基本使用方法:
1 | var express = require('express') |
#API
multer(opts)
Multer 接受一个 options 对象, 其中最基本的是 dest 属性, 这将告诉 Multer 将上传文件保存在哪. 如果你省略 options 对象, 这些文件将保存在内存中,永远不会写入磁盘。
为了避免命名冲突, Multer 会修改上传的文件名. 这个重命名功能可以根据您的需要定制。
以下是可以传递给Multer的选项.
Key Description
dest or storage 在哪里存储文件
fileFilter 文件过滤器,控制哪些文件可以被接受
limits 限制上传的数据
通常, 只需要设置 dest 属性 像这样:
1 | var upload = multer({ dest: 'uploads/' }) |
如果你想在上传时进行更多的控制, 你可以使用storage选项替代dest. Multer 具有 DiskStorage 和 MemoryStorage 两个存储引擎; 另外还可以从第三方获得更多可用的引擎.
.single(fieldname)
接受一个以 fieldname 命名的文件. 这个文件的信息保存在 req.file.
.array(fieldname[, maxCount])
接受一个以 fieldname 命名的文件数组. 可以配置 maxCount 来限制上传的最大数量. 这些文件的信息保存在 req.files.
.fields(fields)
接受指定 fields 的混合文件. 这些文件的信息保存在 req.files.
fields 应该是一个对象数组,应该具有 name 和可选的 maxCount属性. Example:
[
{ name: ‘avatar’, maxCount: 1 },
{ name: ‘gallery’, maxCount: 8 }
]
.none()
只接受文本域. 如果任何文件上传到这个模式, 将发生 “LIMIT_UNEXPECTED_FILE” 错误. 这和 upload.fields([]) 的效果一样.
.any()
接受一切. 文件数组将保存在 req.files.
警告: 确保你总是处理了用户的文件上传. 永远不要将multer作为全局中间件使用,因为恶意用户可以上传文件到一个你没有预料到的路由,应该只在你需要处理上传文件的路由上使用.
storage
DiskStorage
磁盘存储引擎可以让你控制文件的存储.
1 | var storage = multer.diskStorage({ |
destination 是用来确定上传的文件应该存储在哪个文件夹中. 也可以提供一个 string (例如 ‘/tmp/uploads’). 如果没有设置 destination , 则使用操作默认的临时文件夹.
filename 用于确定文件夹中的文件名的确定。 如果没有设置filename , 每个文件将设置为一个随机文件名,并且是没有扩展名的
注意: Multer 不会为你添加任何扩展名, 你的程序应该返回一个完整的文件名.此时就可以在file.originName中获取扩展名。
limits
可以使用下面这些:
Key Description Default
fieldNameSize field 名字最大长度 100 bytes
**fieldSize ** field 值的最大长度 1MB
fields 非文件 field 的最大数量 无限
fileSize 在multipart表单中, 文件最大长度 (字节单位) 无限
files 在multipart表单中, 文件最大数量 无限
**parts ** 在multipart表单中, part传输的最大数量(fields + files) 无限
headerPairs For multipart forms, the max number of header key=>value pairs to parse 2000
fileFilter
设置一个函数来控制什么文件可以上传以及什么文件应该跳过,这个函数应该看起来像这样:
1 | function fileFilter (req, file, cb) { |