Skip to main content

Handling File Uploads in Express

Express and Multi-Part Uploads

Historically I've used the express Multer middleware and associated typescript types (@types/multer).

Multer accepts files encoded as part of a multipart/form-data request. The file is added to the req object as req.file : Express.Multer.File

This is done by adding a middleware to the route that accepts files like so:

import multer from 'multer'


...


const uploadMiddleware = multer({limits:{
    fileSize: config.uploads.maxSize
}})

router.post('/blah', 
    uploadMiddleware.single('file'), 
    controllerFunction );


Storing Uploaded Files in S3

It is possible to use minio to immediately pass the file through to an S3 layer via the buffer object. Using a Minio client object:

async function handleFileUpload(req: Express.Request, res: Express.Response) {
  
  const fileObj : Express.Multer.File = req.file
  let file = await Minio.putObject(config.minio.bucket, objName, fileObj.buffer);
  
  return {"status":"uploaded", file}

}

Dealing with CSVs

Use neat-csv for a promisy experience