Multer详解(Node.js中间件)

文章目录

  • 介绍
  • 使用(摘自官方解释)
    • multer(options)
    • storage(储存引擎)
      • .single(fieldname)
      • .none()
      • .fields(fields)
    • limits(限制)
    • 错误处理机制

介绍

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。它是写在 busboy 之上非常高效。
注意: Multer 不会处理任何非 multipart/form-data 类型的表单数据

使用(摘自官方解释)

guthub官方解释链接
Multer在解析完请求体后,会向Request对象中添加一个body对象和一个file或files对象(上传多个文件时使用files对象 )。其中,body对象中包含所提交表单中的文本字段(如果有),而file(或files)对象中包含通过表单上传的文件。

const express = require('express')
const multer  = require('multer')
const app = express()const storage = multer.diskStorage({//保存路径destination: function (req, file, cb) {cb(null, '/tmp/my-uploads')//注意这里的文件路径,不是相对路径,直接填写从项目根路径开始写就行了},//保存在 destination 中的文件名filename: function (req, file, cb) {    cb(null, file.fieldname + '-' + Date.now())}
})
const upload = multer({ storage: storage })app.post('/profile', upload.single('avatar'), function (req, res, next) {// req.file 是 `avatar` 文件的信息// req.body 将具有文本域数据,如果存在的话
})
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {// req.files 是 `photos` 文件数组的信息// req.body 将具有文本域数据,如果存在的话
})
const cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {// req.files 是一个对象 (String -> Array) 键是文件名,值是文件数组// 例如://  req.files['avatar'][0] -> File//  req.files['gallery'] -> Array// req.body 将具有文本域数据,如果存在的话
})

multer(options)

Multer 接受一个 options 对象,其中最基本的是 dest 属性,这将告诉 Multer 将上传文件保存在哪。如果你省略 options 对象,这些文件将保存在内存中,永远不会写入磁盘。
通常,一般的网页应用,只需要设置 dest 属性,像这样:

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

如果你想在上传时进行更多的控制,你可以使用 storage 选项替代 dest。Multer 具有 DiskStorage 和 MemoryStorage 两个存储引擎; 另外还可以从第三方获得更多可用的引擎。

storage(储存引擎)

destination 是用来确定上传的文件应该存储在哪个文件夹中。也可以提供一个 string (例如 ‘/tmp/uploads’)。如果没有设置 destination,则使用操作系统默认的临时文件夹
注意: 如果你提供的 destination 是一个函数,你需要负责创建文件夹。当提供一个字符串,multer 将确保这个文件夹是你创建的。
filename 用于确定文件夹中的文件名的确定。 如果没有设置 filename,每个文件将设置为一个随机文件名,并且是没有扩展名的

.single(fieldname)

接受一个以 fieldname 命名的文件。这个文件的信息保存在 req.file

.none()

只接受文本域

.fields(fields)

接受指定 fields 的混合文件。这些文件的信息保存在 req.files。
fields 应该是一个对象数组,应该具有 name 和可选的 maxCount 属性。

limits(限制)

onFileUploadStart新的multerAPI 没有。如果要限制文件大小,则应添加limits: { fileSize: maxSize }到传递给的对象multer():
在这里插入图片描述
示例:

var upload = multer({storage: storage,limits: { fileSize: maxSize }
}).single('bestand');

错误处理机制

如果你想捕捉 multer 发出的错误,你可以自己调用中间件程序。如果你想捕捉 Multer 错误,你可以使用 multer 对象下的 MulterError 类 (即 err instanceof multer.MulterError)。

const multer = require('multer')
const upload = multer().single('avatar')app.post('/profile', function (req, res) {upload(req, res, function (err) {if (err instanceof multer.MulterError) {// 发生错误} else if (err) {// 发生错误}// 一切都好})
})

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注