【问题标题】:"MulterError: Unexpected field\n at wrappedFileFilter using AWS, Multer S3, NodeJS, Mongo“MulterError:使用 AWS、Multer S3、NodeJS、Mongo 的 WrappedFileFilter 出现意外字段\n
【发布时间】:2021-05-06 16:28:08
【问题描述】:

我花了几天时间试图弄清楚如何将照片发布到我的 AWS 存储桶,并阅读了很多关于 SO 的类似问题,但似乎没有任何效果,而且我几乎总是收到“意外字段”错误。

我已确认库是正确的版本;添加了bodyParser;添加区域/签名版本;并尝试以多种方式更改 'upload.single('image')。

在我的模型中,我试图将图像 url 保存到字段名称“image-field”,但使用它不会改变我得到的错误。我只是在尝试 FE 之前尝试在我的后端进行这项工作,并与 PostMan 一起使用。

请帮忙,我在这里疯了。

import express from 'express';
import aws from 'aws-sdk';
import multer from 'multer';
import multerS3 from 'multer-s3';
import bodyParser from 'body-parser';

const router = express.Router();
router.use(bodyParser.json())

aws.config.update({
  secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
  accessKeyId: process.env.AWS_ACCESS_KEY_ID,
  region: 'us-west-2',
  signatureVersion: 'v4'
})

const s3 = new aws.S3()

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'bucket-name',
    acl: "public-read",
    metadata: function (req, file, cb) {
      cb(null, { fieldName: file.fieldname });
    },
    key: function (req, file, cb) {
      cb(null, Date.now().toString() + '-' + file.originalname);
    },
  }),
})

router.post('/', upload.single('image'), (req, res, next) => {
  console.log('Uploaded!')
  res.send(req.file)
})

export default router;

邮递员 enter image description here

注意:如果有帮助,我将包含我成功用于我的 FE 和 BE 的旧代码,以在本地保存图像,然后在 Mongo 上保存 url。

import path from 'path';
import express from 'express';
import multer from 'multer';

const router = express.Router();

const storage = multer.diskStorage({
destination(req, file, cb) {
  cb(null, 'uploads/')
},
filename(req, file, cb) {
  cb(null, `${file.fieldname}-${Date.now()}${path.extname(file.originalname)}`)
}
})

function checkFileType(file, cb) {
const filetypes = /jpg|jpeg|png/
const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
const mimetype = filetypes.test(file.mimetype)

if(extname && mimetype) {
  return cb(null, true)
} else {
  cb('Images only!')
}
}

const upload = multer({
storage,
fileFilter: function(req, file, cb) {
  checkFileType(file, cb)
}
})

router.post('/', upload.single('image'), (req, res) => {
res.send(`/${req.file.path}`)
})

export default router;

【问题讨论】:

    标签: node.js reactjs mongodb amazon-s3 multer-s3


    【解决方案1】:

    我们做到了!请参见下面的代码,但更新实际上涉及将 POST API 从 .single() 更改为 .any() ,然后设置 fileFilter 以删除您不想包含的任何文件。我会注意到,当我发布文件时,PostMan 在我的路线上给了我一个错误,但图像确实成功上传到了 s3 存储桶。

    换一种说法,.any()“接受通过网络传输的所有文件。文件数组将存储在 req.files 中”。由于我们知道我们正在获取任何文件,因此我们必须使用 fileFilter 来定义我们希望能够发布哪些文件。本质上,如果你不使用 fileFilter,你可以发布任何你想要的文件。

    import express from 'express';
    import aws from 'aws-sdk';
    import multer from 'multer';
    import multerS3 from 'multer-s3';
    import path from 'path';
    
    const router = express.Router();
    
    aws.config.update({
      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
      accessKeyId: process.env.AWS_ACCESS_KEY_ID,
      region: 'us-west-2',
      signatureVersion: 'v4'
    })
    
    const s3 = new aws.S3()
    
    function checkFileType(file, cb) {
      const filetypes = /jpg|jpeg|png/
      const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
      const mimetype = filetypes.test(file.mimetype)
    
      if(extname && mimetype) {
        return cb(null, true)
      } else {
        cb('Images only!')
      }
    }
    
    const upload = multer({
      limits: { fileSize: 2000000 },
      fileFilter: function(req, file, cb) {
        checkFileType(file, cb)
      },
      storage: multerS3({
        s3: s3,
        bucket: 'recipebook-recipe-cover-images',
        acl: "public-read",
        contentType: multerS3.AUTO_CONTENT_TYPE,
        metadata: function (req, file, cb) {
          cb(null, { fieldName: file.fieldname });
        },
        key: function (req, file, cb) {
          cb(null, Date.now().toString() + '-' + file.originalname);
        },
      }),
    })
    
    router.post('/', upload.any())
    
    export default router;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-12
      • 2021-04-05
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 2015-10-10
      • 1970-01-01
      相关资源
      最近更新 更多