express multer 如何上传不同类型不同大小的文件

express multer how to upload different types of files with different sizes

const express = require("express");
const multer  =  require("multer");
const makeDir = require('make-dir');
const fs = require('fs');
const path = require('path');

const upload = multer({
  storage: Storage,  
  fileFilter: (req, file, cb) => {
    console.log("upload fileFilter req ::", req.file); 
      checkFileType(file, cb);
  }
}).fields(
  [
    {
      name:'comppic',
      maxCount:1
    },
      {
      name:'userpic',
      maxCount:1
      },
      {
      name:'usercv',
      maxCount:1
      }      
  ]
);

function checkFileType(file, cb) {    
  console.log("file:::::::::::::::", file);
}

我正在使用上面的代码上传文件。在那里我如何检查正在上传的文件的大小,如果文件大小超过 returns 错误。

console.log("upload fileFilter req ::", req.file);  // output undefined
console.log("file:::::::::::::::", file);

输出

file::::::::::::::: {
  fieldname: 'userpic',
  originalname: 'DSC01416.JPG',
  encoding: '7bit',
  mimetype: 'image/jpeg'
}

请帮我解决一下

基于文件类型的不同文件大小限制,req.rawHeaders中有文件大小,所以我根据类型文件在fileFilter中写了一个逻辑,这对我有用,multer set .any 为 multer。 req.rawHeaders 是数组,其中一项是文件大小,在我的请求中,文件大小在数组中的最后一项所以我使用 req.rawHeaders.slice(-1)[0]

在这个逻辑中,.pdf < 1 Mb.png,.jpeg,.jpg < 4 Mb

的大小
const multer = require('multer');
const { v4: uuid } = require("uuid");

const TYPE_IMAGE = {
  'image/png': 'png',
  'image/jpeg': 'jpeg',
  'image/jpg': 'jpg'
};
const TYPE_File = {
  'application/pdf': 'pdf',
};

const fileUpload = 
  multer({
    limits: 500000, 
    storage: multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, 'uploads/images');
      },
      filename: (req, file, cb) => {
        const ext = (TYPE_IMAGE[file.mimetype]) ? TYPE_IMAGE[file.mimetype] : TYPE_File[file.mimetype];
        cb(null, uuid() + '.' + ext);
      }
    }),
    fileFilter: (req, file, cb) => {
      let size = +req.rawHeaders.slice(-1)[0]
      let isValid =false;
      if(!!TYPE_IMAGE[file.mimetype] && size < 4 * 1024 * 1024  ){
        isValid = true
      }
      if(!!TYPE_File[file.mimetype] && size < 1 * 1024 * 1024  ){
        isValid = true
      }
      let error = isValid ? null : new Error('Invalid mime type!');
      cb(error, isValid);
    }
  }).any();


module.exports = fileUpload;