• 微信:WANCOME
  • 扫码加微信,提供专业咨询
  • 服务热线
  • 13215191218
    13027920428

  • 微信扫码访问本页
desc-2
环企首页

multer

概述

multer 是 Express 生态中最流行的文件上传处理中间件,专注于处理 multipart/form-data 格式的文件上传。支持文件大小限制、类型过滤、存储位置配置、单/多文件上传等。

安装:

npm install multer

核心函数

创建实例

const multer = require('multer')

// 内存存储(文件存在 Buffer 中)
const upload = multer({ dest: 'uploads/' })

// 磁盘存储(可控制文件名和路径)
const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, 'uploads/avatars/'),
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
    const ext = path.extname(file.originalname)
    cb(null, file.fieldname + '-' + uniqueSuffix + ext)
  }
})
const upload = multer({ storage })

上传方式

upload.single('avatar')          // 单文件
upload.array('photos', 10)       // 同字段多文件
upload.fields([                  // 多字段
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 5 }
])
upload.any()                      // 任意字段
upload.none()                     // 无文件

路由使用

app.post('/profile', upload.single('avatar'), (req, res) => {
  // req.file — 单文件信息
  // { fieldname, originalname, mimetype, size, path, ... }
  res.json({ success: true, file: req.file.filename })
})

app.post('/photos', upload.array('photos', 10), (req, res) => {
  // req.files — 文件数组
  res.json({ count: req.files.length })
})

配置选项

const upload = multer({
  storage,
  limits: {
    fileSize: 5 * 1024 * 1024,   // 单文件最大 5MB
    files: 5,                    // 最多文件数
    fieldSize: 2 * 1024 * 1024  // 单字段最大
  },
  fileFilter: (req, file, cb) => {
    const allowed = ['image/jpeg', 'image/png', 'image/gif']
    if (allowed.includes(file.mimetype)) cb(null, true)
    else cb(new Error('只允许上传 JPG/PNG/GIF 图片'), false)
  }
})

错误处理

app.use((err, req, res, next) => {
  if (err instanceof multer.MulterError) {
    if (err.code === 'LIMIT_FILE_SIZE') return res.status(400).json({ error: '文件过大' })
    if (err.code === 'LIMIT_FILE_COUNT') return res.status(400).json({ error: '文件数量超限' })
  }
  res.status(500).json({ error: err.message })
})

常见问题

问题 解决方案
req.file 为 undefined 检查 form 是否设置 enctype="multipart/form-data"
文件大小超限 增加 limits.fileSize
想自定义存储路径 diskStorage 配置 destination
同一字段传多文件报 400 upload.array() 而非 upload.single()