Как применить ограничения на размер загружаемого файла при использовании busboy? - PullRequest
0 голосов
/ 20 февраля 2020

Не хотел хранить загруженные файлы на диске или в памяти в качестве промежуточного шага, поэтому решил использовать 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?

В соответствии с моим первоначальным намерением, я хотел бы избежать хранения на диске или в памяти, если это возможно ...

1 Ответ

0 голосов
/ 30 апреля 2020

В соответствии с документацией , в специальных событиях busboy

Если достигнут сконфигурированный предел размера файла, оба потока будут иметь усеченное логическое свойство (лучше всего проверять в конце потока) и отправьте событие limit, чтобы уведомить вас, когда это произойдет.

Так что вы можете использовать в вашем случае

stream.on('limit', function(data) {                                               
 console.log("LIMIT"); });
...