Navigation

Node.js

Node.js How to Handle File Uploads with Multer

Handle file uploads in Express.js using Multer middleware. Simple solution for single and multiple file uploads with validation and storage options.

Table Of Contents

Problem

You need to handle file uploads in your Express.js application, whether it's profile pictures, documents, or multiple files, with proper validation and storage.

Solution

const express = require('express');
const multer = require('multer');
const path = require('path');
const app = express();

// Configure storage
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/'); // Make sure this directory exists
  },
  filename: (req, file, cb) => {
    // Generate unique filename
    const uniqueName = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, uniqueName + path.extname(file.originalname));
  }
});

// Configure multer with validation
const upload = multer({
  storage: storage,
  limits: {
    fileSize: 5 * 1024 * 1024 // 5MB limit
  },
  fileFilter: (req, file, cb) => {
    // Allow only images
    if (file.mimetype.startsWith('image/')) {
      cb(null, true);
    } else {
      cb(new Error('Only image files are allowed!'), false);
    }
  }
});

// Single file upload
app.post('/upload/single', upload.single('profilePicture'), (req, res) => {
  if (!req.file) {
    return res.status(400).json({ error: 'No file uploaded' });
  }
  
  res.json({
    message: 'File uploaded successfully',
    file: {
      filename: req.file.filename,
      originalname: req.file.originalname,
      size: req.file.size,
      path: req.file.path
    }
  });
});

// Multiple files upload
app.post('/upload/multiple', upload.array('documents', 5), (req, res) => {
  if (!req.files || req.files.length === 0) {
    return res.status(400).json({ error: 'No files uploaded' });
  }
  
  res.json({
    message: `${req.files.length} files uploaded successfully`,
    files: req.files.map(file => ({
      filename: file.filename,
      originalname: file.originalname,
      size: file.size
    }))
  });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Install multer and create uploads directory:

npm install multer
mkdir uploads

Explanation

Multer handles multipart/form-data for file uploads. diskStorage saves files to disk with custom naming. The fileFilter function validates file types, while limits restricts file size.

upload.single('fieldName') handles one file, upload.array('fieldName', maxCount) handles multiple files. The uploaded file info is available in req.file (single) or req.files (multiple) containing filename, size, and path details.

Share this article

Add Comment

No comments yet. Be the first to comment!

More from Node.js