Introduction to Busboy
Busboy is a high-performance, low-level Node.js module that allows you to process file uploads in a streaming fashion. It is particularly useful for handling large file uploads without using excessive memory resources.
Getting Started with Busboy
First, let’s install the busboy
module:
npm install busboy
Basic Usage
To use Busboy, you typically set it up as middleware in an Express application:
const express = require('express');
const Busboy = require('busboy');
const fs = require('fs');
const path = require('path');
const app = express();
app.post('/upload', (req, res) => {
const busboy = new Busboy({ headers: req.headers });
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const saveTo = path.join(__dirname, 'uploads', path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', () => {
res.writeHead(200, { 'Connection': 'close' });
res.end("File uploaded successfully!");
});
return req.pipe(busboy);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
Configuring Busboy
Busboy can be configured with several options. Here are some common configurations:
const busboy = new Busboy({
headers: req.headers,
highWaterMark: 2 * 1024 * 1024, // Set highWaterMark to 2MB
limits: {
fileSize: 10 * 1024 * 1024, // Limit file size to 10MB
files: 5, // Limit number of files uploaded
}
});
Handling Errors
Error handling is crucial for robust applications. Here’s how to handle errors in Busboy:
busboy.on('error', (err) => {
console.error('Error during file upload', err);
res.writeHead(500, { 'Connection': 'close' });
res.end("Upload failed!");
});
Storing Files in Memory
Sometimes you may want to store files in memory instead of saving them directly to disk:
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
let buffers = [];
file.on('data', (data) => {
buffers.push(data);
});
file.on('end', () => {
const fileBuffer = Buffer.concat(buffers);
// Do something with fileBuffer, e.g., save to database
});
});
Saving Metadata
Busboy also allows you to save file metadata, such as the fieldname or mime type:
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const fileData = {
fieldname,
filename,
encoding,
mimetype
};
// Save fileData to database or process it as needed
});
Real-World Application Example
Let’s create a small application that uses Busboy to upload files, store them in a directory, and return the list of uploaded files:
const express = require('express');
const Busboy = require('busboy');
const fs = require('fs');
const path = require('path');
const app = express();
const uploadPath = path.join(__dirname, 'uploads');
app.post('/upload', (req, res) => {
const busboy = new Busboy({ headers: req.headers });
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const saveTo = path.join(uploadPath, path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', () => {
fs.readdir(uploadPath, (err, files) => {
if (err) {
res.writeHead(500, { 'Connection': 'close' });
res.end("Failed to list files!");
return;
}
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ files }));
});
});
return req.pipe(busboy);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
Conclusion
Busboy is a powerful, efficient, and flexible choice for handling file uploads in Node.js. By leveraging its streaming capabilities, you can build scalable and resource-efficient file upload services.
Happy coding!
Hash: 2a9af83d983d8dff397fefc03ef7cb874ecf6dd112b9c48e261c05105f224020