5 min read
ā¢Question 27 of 28mediumHow 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