Multer详解(Node.js中间件)

介绍

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) {
    
    
      // 发生错误
    }

    // 一切都好
  })
})

猜你喜欢

转载自blog.csdn.net/qq_45859670/article/details/123306590
今日推荐