Не хотел хранить загруженные файлы на диске или в памяти в качестве промежуточного шага, поэтому решил использовать busboy
для обработки загрузки файлов на AWS S3. Вот мой код:
function handleUpload(req, res, bucket, key) {
let bb = new Busboy({ headers: req.headers, limits: { fileSize: 10 * 1024 * 1024 , files: 1 } });
const uploads = [];
bb.on('file', (fieldname, stream, filename, encoding, mimeType) => {
console.log(`Uploaded fieldname: ${fieldname}; filename: ${filename}, mimeType: ${mimeType}`);
const params = { Bucket: bucket, Key: key, Body: stream, ContentType: mimeType };
uploads.push({ filename, result: S3.svc.upload(params).promise().then(data => data).catch(err => err) });
});
bb.on('finish', async () => {
const results = await Promise.all(uploads.map(async (upload) => ({ ...upload, result: await upload.result })));
// handle success/failure
});
req.pipe(bb);
}
Это хорошо работает, но проблема в том, что busboy
устанавливает ограничения по размеру не путем выдачи ошибки, а просто путем усечения загруженного файла без вывода сообщений.
Как Могу ли я замкнуть / прервать загрузку, если файл слишком большой, и вернуть ошибку в моем API?
В соответствии с моим первоначальным намерением, я хотел бы избежать хранения на диске или в памяти, если это возможно ...