Express 上传文件获取 req.body 为空对象

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()
    }
  })
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值