Express 上传文件获取 req.body为空对象
问题描述
环境:Node
框架:express
场景:上传文件
请求:Headers 中 Content-Type 为 multipart/form-data 类型
问题:获取 req.body 为空对象
问题解决
添加中间件,例如:multer (npm包使用) 等
中间件正确方式挂在后可正常通过 req.body 方式接收
相关示例
router 文件: uploadFile 方法挂载
const express = require('express')
const router = express.Router()
const { add, list, remove, updata } = require('../controllers/positions')
const { uploadFile } = require('../middleware/upload')
router.post('/add', uploadFile, add)
router.post('/updata', uploadFile, updata)
router.get('/list', list)
router.delete('/remove', remove)
module.exports = router
middleware 文件: uploadFile 方法定义
const path = require('path')
const mime = require('mime')
const multer = require('multer')
// 存储到本地磁盘
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, path.join(__dirname, '../public/uploads'))
},
filename: function (req, file, cb) {
const fileName = `${file.fieldname}-${Date.now()}.${mime.getExtension(file.mimetype)}`
cb(null, fileName)
}
})
// 限制大小
const limits = {
fileSize: 1024 * 200
// fields: 1
}
// 文件类型过滤
function fileFilter(req, file, cb) {
const whitelist = ['image/png', 'image/jpg', 'image/jpeg', 'image/webp', 'image/gif']
if (whitelist.includes(file.mimetype)) {
// 接受这个文件,使用`true`,像这样:
cb(null, true)
} else {
// 拒绝这个文件,使用`false`,像这样:
// cb(null, false)
// // 如果有问题,你可以总是这样发送一个错误:
cb(new Error('图片格式仅支持:jpg/jpeg/png/gif/webp'))
}
}
const upload = multer({
storage,
limits,
fileFilter
}).single('companyLogo')
exports.uploadFile = (req, res, next) => {
upload(req, res, function (err) {
if (err instanceof multer.MulterError) {
// 发生错误
let msg = err.message === 'File too large' ? '图片大小不得超出 200k.' : err.message
res.render('fail', {
data: JSON.stringify({ massage: msg })
})
} else if (err) {
// 发生错误
res.render('fail', {
data: JSON.stringify({ massage: err.message })
})
} else {
// 一切都好
next()
}
})
}