A library to create readable multipart/form-data streams for form and file uploads.
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Header generation and boundary management for multipart streams, including automatic content-type header creation, custom boundary setting, and user header merging.
Generates headers object with proper content-type and boundary, merging with optional user headers.
/**
* Get headers including content-type with boundary
* @param userHeaders - Optional additional headers to merge
* @returns Headers object with content-type and merged user headers
*/
getHeaders(userHeaders?: Headers): Headers;
interface Headers {
[key: string]: any;
}Usage Examples:
const FormData = require('form-data');
const http = require('http');
const form = new FormData();
form.append('field', 'value');
// Basic headers
const headers = form.getHeaders();
console.log(headers);
// Output: { 'content-type': 'multipart/form-data; boundary=--------------------------...' }
// Merge with custom headers
const headers = form.getHeaders({
'Authorization': 'Bearer token123',
'User-Agent': 'MyApp/1.0',
'X-Custom-Header': 'custom-value'
});
// Use with Node.js HTTP client
const request = http.request({
method: 'POST',
host: 'example.com',
path: '/upload',
headers: form.getHeaders({
'Accept': 'application/json'
})
});
form.pipe(request);Sets a custom boundary string for the multipart stream.
/**
* Set custom boundary string
* @param boundary - Boundary string (must not appear in data)
* @throws TypeError if boundary is not a string
*/
setBoundary(boundary: string): void;Usage Examples:
const FormData = require('form-data');
const form = new FormData();
// Set custom boundary
form.setBoundary('MyCustomBoundary123');
// Boundary must be unique and not appear in data
form.setBoundary('----formdata-custom-boundary');
console.log(form.getBoundary()); // 'MyCustomBoundary123'
// Invalid boundary (not a string)
try {
form.setBoundary(123); // Throws TypeError
} catch (err) {
console.error('Boundary must be a string');
}Retrieves the current boundary string, generating one if not set.
/**
* Get current boundary string (generates if not set)
* @returns Current boundary string
*/
getBoundary(): string;Usage Examples:
const FormData = require('form-data');
const form = new FormData();
// Get auto-generated boundary
const boundary = form.getBoundary();
console.log(boundary);
// Output: --------------------------515890814546601021194782
// Boundary is consistent across calls
console.log(form.getBoundary() === form.getBoundary()); // true
// Different forms have different boundaries
const form2 = new FormData();
console.log(form.getBoundary() !== form2.getBoundary()); // trueForm-Data automatically generates cryptographically secure boundaries:
// Auto-generated boundary format:
// 26 dashes + 24 random hex characters = 50 total characters
// Example: --------------------------1234567890abcdef12345678
const form = new FormData();
const boundary = form.getBoundary();
console.log(boundary.length); // 50
console.log(boundary.startsWith('--------------------------')); // trueForm-Data normalizes header names to lowercase for consistency:
const form = new FormData();
const headers = form.getHeaders({
'Content-Length': '1024',
'USER-AGENT': 'MyApp',
'X-Custom-Header': 'value'
});
console.log(headers);
// Output: {
// 'content-type': 'multipart/form-data; boundary=...',
// 'content-length': '1024',
// 'user-agent': 'MyApp',
// 'x-custom-header': 'value'
// }With Express.js:
const express = require('express');
const FormData = require('form-data');
const fs = require('fs');
app.post('/proxy-upload', (req, res) => {
const form = new FormData();
form.append('file', fs.createReadStream('local-file.pdf'));
form.append('metadata', JSON.stringify({ user: req.user.id }));
// Forward to external service
form.submit({
host: 'external-api.com',
path: '/upload',
headers: form.getHeaders({
'Authorization': 'Bearer ' + req.headers.authorization
})
}, (err, response) => {
if (err) return res.status(500).json({ error: err.message });
res.status(response.statusCode).json({ success: true });
});
});With Axios:
const axios = require('axios');
const FormData = require('form-data');
const form = new FormData();
form.append('data', 'value');
axios.post('http://api.example.com/upload', form, {
headers: {
...form.getHeaders(),
'Authorization': 'Bearer token',
'X-Request-ID': 'req-123'
},
maxContentLength: Infinity,
maxBodyLength: Infinity
}).then(response => {
console.log('Upload successful');
});Custom Boundary with Headers:
const form = new FormData();
form.setBoundary('MyAppBoundary2023');
// Use in custom header string
const customHeader =
'\r\n--' + form.getBoundary() + '\r\n' +
'Content-Disposition: form-data; name="special"\r\n' +
'X-Custom-Attribute: special-value\r\n\r\n';
form.append('regular_field', 'value');
form.append('special_field', 'data', { header: customHeader });