Search code examples
node.jsexpressmulter

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

I am using above code to upload file. In that how do I check for size of file which is uploading and returns error if file size exceeds.

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

output

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

Please help me to resolve it.


Solution

  • Different file size limitation based on file type, there is size of file in req.rawHeaders so I write a logic in fileFilter based on type file, It's work to me,multer set .any for multer. req.rawHeaders is array, one of the item is size of file, in my request,size of file is in last item in Array so I used req.rawHeaders.slice(-1)[0]

    in this logic, size of .pdf < 1 Mb and .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;