#1 Data Analytics Program in India
₹2,499₹1,499Enroll Now
5 min read
•Question 27 of 28medium

How do you handle file uploads in APIs?

Implementing file upload endpoints.

What You'll Learn

  • Multipart form data
  • File upload handling
  • Best practices

Content-Type

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary

Implementation with Multer

code.jsJavaScript
const multer = require('multer');

// Storage configuration
const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, 'uploads/'),
  filename: (req, file, cb) => {
    const uniqueName = `${Date.now()}-${file.originalname}`;
    cb(null, uniqueName);
  },
});

// File filter
const fileFilter = (req, file, cb) => {
  const allowed = ['image/jpeg', 'image/png', 'image/gif'];
  if (allowed.includes(file.mimetype)) {
    cb(null, true);
  } else {
    cb(new Error('Invalid file type'), false);
  }
};

const upload = multer({
  storage,
  fileFilter,
  limits: { fileSize: 5 * 1024 * 1024 }, // 5MB
});

// Single file upload
app.post('/upload', upload.single('file'), (req, res) => {
  res.json({
    filename: req.file.filename,
    path: req.file.path,
    size: req.file.size,
  });
});

// Multiple files
app.post('/uploads', upload.array('files', 5), (req, res) => {
  res.json({ files: req.files.map(f => f.filename) });
});

Cloud Storage (S3)

code.jsJavaScript
const multerS3 = require('multer-s3');
const { S3Client } = require('@aws-sdk/client-s3');

const s3 = new S3Client({ region: 'us-east-1' });

const upload = multer({
  storage: multerS3({
    s3,
    bucket: 'my-bucket',
    key: (req, file, cb) => cb(null, `uploads/${Date.now()}-${file.originalname}`),
  }),
});

Best Practices

  • Validate file type and size
  • Use unique filenames
  • Store in cloud for scalability
  • Return file URL in response