multer 过滤具有多个字段且每个字段中不同文件类型的文件

问题描述 投票:0回答:2

我正在为客户编写应用程序,他们应该能够上传产品的图像和文档。

哈巴狗/玉/ Html

html 表单/字段集有两个文件输入。一张用于图像,另一张用于文档。

示例

input.product-upload-images(
  type="file", 
  multiple="multiple",
  value="images",
  accept="image/png, image/jpg ,image/jpeg")

input.product-upload-documents(
  type="file",
  multiple="multiple",
  value="Documents",
  accept="application/pdf")

路由器

在我的 POST/PUT 控制器中,我想使用中间件检查字段

images[]
中的所有文件是否都是 MIME 类型
image/...
以及字段
documents[]
中的所有文件是否都是 MIME 类型
image/pdf

示例

我删除了一些中间件,例如护照中间件或数据验证中间件,以提供一个易于理解的示例。

const uploadPath = path.join('some', 'path');
const upload = multer({
    dest: uploadPath,
    fileFilter: (req, file, cb) => {
        // filter filetype by field
    }
});
const uploadMiddleware = upload.fields([
    {name: 'documents[]', maxCount: 10},
    {name: 'images[]', maxCount: 10}
]);

// ...

router.post(
    '/',
    uploadMiddleware,
    async (req, res, next) => {
        // ...

问题

如何实现文件过滤器,可以过滤文件类型的某个字段?

node.js express multer
2个回答
0
投票

我将继续修改您的代码,以包含用于多个字段上传的

fileFilter
回调函数的实现。

...
const upload = multer({
    dest: uploadPath,
    fileFilter: (req, file, cb) => {
      // filter filetype by field - `file` will all be a single File object
      if (['image/png', 'image/jpeg', 'application/pdf'].include(file.mimetype)) {
        cb(null, true);
      } else {
        cb(new Error('unknown file type.'));
      }
});
...

需要注意的是,由于上传是字段 - 每个字段可以包含多种文件类型,multer 会将 fileFilter 回调中的所有字段转储为单个文件对象而不是数组,它通过调用每个文件的 fileFilter 回调。但是,在您的控制器中,您将对字段进行排序并正确添加到数组中。

例如,假设

document
字段和
image
字段分别包含 3 个和 2 个文件,那么 multer 将在 fileFilter 回调函数中列出 5 个对象,并在控制器(最终中间件处理程序)中创建一个带有键
 的对象数组documents
images
:req.files 将打印以下对象。

[Object: null prototype] {
  documents: [
    {
      fieldname: 'documents',
      originalname: 'doc.pdf',
      encoding: '7bit',
      mimetype: 'document/pdf',
      ...
    },
    {},
    {}
  ],
  images: [
    {
      fieldname: 'image1',
      originalname: 'avatar.jpg',
      encoding: '7bit',
      mimetype: 'image/jpeg',
      ...
    },
    {}
  ]
}

注意 在以下代码片段中:

const uploadMiddleware = upload.fields([
  {name: 'documents[]', maxCount: 10},
  {name: 'images[]', maxCount: 10}
]);

我假设

{ name: 'documents[]', maxCount: 10 }
{ name: 'images[]', maxCount: 10 }
{ name: 'documents', maxCount: 10 } and { name: 'images', maxCount: 10 }


-1
投票

您还可以通过回调指定目的地。

const exampleMimeType = 'image'
const storage = multer.destination({
  destination: (req, file, cb) => {
    if(file.mimeType === exmpleMimeType){
      cb(null, `/files/${exampleMimeType}`)
    }
  }


})

© www.soinside.com 2019 - 2024. All rights reserved.