Tengo busboy en mi aplicación ExpressJS para la transmisión de archivos. Ahora, en algún momento, deseo enviar una respuesta regular de que el tamaño del archivo es demasiado grande. ¿Cómo puedo hacer eso?
Aquí está mi código para ilustrar lo que quiero:
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype); let fileSize = 0; file.on('data', function(data) { fileSize += data.length; console.log('File [' + fieldname + '] got ' + data.length + ' bytes'); }); file.on('end', function() { console.log('File [' + fieldname + '] Finished'); if (fileSize > MAXIMUM_ALLOWED_FILE_UPLOAD_SIZE) { //I wish to send back a regular response that the file size is too large here. } fileSize = 0; }); }); busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) { console.log('Field [' + fieldname + ']: value: ' + inspect(val)); });¿Cómo puedo lograr eso?
Busboy tiene un tamaño máximo de bytes de archivo que puede especificar en la opción de límites, lo que evitará que introduzca más datos en el archivo que su límite especificado. Si desea limitar el tamaño de carga de su archivo, me iría con eso. Emite un evento de 'límite' en el archivo si alcanza el tamaño máximo.
Busboy también maneja cargas múltiples, no estoy seguro si desea manejar eso o no. Pero aquí hay una muestra con un límite y múltiples cargas:
var express = require('express'); var Busboy = require('busboy'); var html_escaper = require('html-escaper'); var fs = require('fs'); var escaper = html_escaper.escape; const MAX_UPLOAD_SIZE = 10000; var app = express(); app.get('/', function(req, res) { res.writeHead(200, {'Content-type': 'text/html'}) res.write('<!doctype html><html><body>'); res.write('<form action="fileupload" method="post" enctype="multipart/form-data">') res.write('<input type="file" name="upload_1">') res.write('<input type="file" name="upload_2">'); res.write('<input type="submit"></form>'); res.write('</body></html>') return res.end(); }) app.post('/fileupload', function (req, res) { var busboy = new Busboy({ headers: req.headers, limits: { fileSize: MAX_UPLOAD_SIZE } }); var fileList = []; busboy.on('file', function(fieldname, file, filename, encoding, mimetype ) { fileInfo = { 'fObj': file, 'file': filename, 'status': 'uploaded' } fileList.push(fileInfo); file.on('limit', function() { fileInfo.status = `Size over max limit (${MAX_UPLOAD_SIZE} bytes)`; }); file.on('end', function() { if (fileInfo.fObj.truncated) { if (fileInfo.status === 'uploaded') { // this shouldn't happen console.error(`we didn't get the limit event for ${fObj.file}???`); fileInfo.status = `Size over max limit (${MAX_UPLOAD_SIZE} bytes)`; } } }); file.pipe(fs.createWriteStream(`./uploads/${fileList.length}.bin`)); }); busboy.on('finish', function() { var out = ""; fileList.forEach(o => { out += `<li>${escape(o['file'])} : ${o['status']}</li>` }); res.writeHead(200, {'Connection': 'close'}); res.end(`<html><body><ul>${out}</ul></body></html>`); }) return req.pipe(busboy); }); app.listen(8080);