Header Ads

Handle Large File Uploads in Node.js Without Crashing the Server

Step-by-Step Guide to Handling Large File Uploads in Node.js Without Crashing the Server

Introduction

Handling large file uploads in Node.js can be tricky. If not managed correctly, they can consume excessive memory, slow down performance, or even cause your server to crash. This guide walks you through a safe, scalable way to process big files without exhausting system resources.


1. Why Large File Uploads Can Crash Your Server

When a large file is uploaded, Node.js will process it in memory by default unless you explicitly handle it differently. If the file size exceeds available memory, your application can freeze or crash.

Key issues:

  • Memory overload – loading the entire file into memory at once.
  • Blocking the event loop – preventing other requests from being processed.
  • Slow client uploads – keeping connections open too long.


2. Use Streaming Instead of Buffering

Instead of reading the whole file into memory, use streaming. This allows you to process the file in chunks.

Example using Multer with streams:

npm install express multer


const express = require('express');

const multer = require('multer');

const fs = require('fs');


const app = express();

const upload = multer({ dest: 'uploads/' });


app.post('/upload', upload.single('file'), (req, res) => {

  const filePath = req.file.path;


  // Process file in chunks

  const readStream = fs.createReadStream(filePath);

  readStream.on('data', chunk => {

    console.log(`Processing chunk of size: ${chunk.length}`);

  });


  readStream.on('end', () => {

    res.send('File uploaded and processed successfully.');

  });


  readStream.on('error', err => {

    console.error(err);

    res.status(500).send('Error processing file.');

  });

});


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


3. Limit File Size to Prevent Abuse

Multer allows you to set a maximum file size to protect your server.

const upload = multer({

  dest: 'uploads/',

  limits: { fileSize: 50 * 1024 * 1024 } // 50 MB

});


4. Use Temporary Storage

Never store uploaded files directly in memory. Always save them temporarily to disk or a cloud storage service like Amazon S3 or Google Cloud Storage.

Example of uploading directly to S3:

npm install aws-sdk multer-s3

const AWS = require('aws-sdk');

const multerS3 = require('multer-s3');


AWS.config.update({ region: 'us-east-1' });

const s3 = new AWS.S3();


const upload = multer({

  storage: multerS3({

    s3,

    bucket: 'your-bucket-name',

    key: (req, file, cb) => {

      cb(null, Date.now().toString() + '-' + file.originalname);

    }

  })

});


5. Enable Chunked Uploads

For extremely large files, split them into smaller chunks on the client side (e.g., using JavaScript File API) and upload them individually. Then, merge them server-side.

Refer: Chunked upload


6. Monitor Memory Usage

Always keep track of memory usage to detect potential overloads early.

setInterval(() => {

  const used = process.memoryUsage().heapUsed / 1024 / 1024;

  console.log(`Memory usage: ${Math.round(used * 100) / 100} MB`);

}, 5000);


7. Use a Reverse Proxy

Placing NGINX in front of your Node.js server can handle buffering, client connections, and prevent direct overload.


Conclusion

By using streaming, size limits, chunked uploads, and proper storage strategies, you can safely handle large file uploads in Node.js without risking downtime or crashes. 

Post a Comment

0 Comments