Я пишу бессерверный api с использованием Node.js и Typescript. Я хочу отправить файл .xlsx со стороны клиента и сохранить его в корзине S3. Я пробовал использовать пакет npm консьерж. И файл, сохраненный в корзине S3, не может быть прочитан (поврежден или записан не полностью). Похоже, я неправильно записал файл. Вот мой код
import * as busboy from 'busboy';
import AWS = require('aws-sdk');
import { S3 } from 'aws-sdk';
export const saveExcel: Handler = (event: APIGatewayEvent, context: Context, cb: Callback) => {
const contentType = event.headers['Content-Type'] || event.headers['content-type'];
const bb: busboy.Busboy = new busboy({ headers: { 'content-type': contentType } });
bb.on('file', function (fieldname, file, filename, encoding, mimetype) {
file
.on('data', data => {
const params: S3.PutObjectRequest = {
Bucket: 'bucket-name',
Key: filename,
Body: data
};
s3.upload(params, function (err, data) {
if (err) {
console.info(err);
} else {
console.info(data);
}
})
})
.on('end', () => {
console.info("done");
});
});
bb.end(event.body);
}
Что я делаю неправильно? Или мне нужно попробовать любую другую библиотеку?
@hoangdv Я не могу этого сделать в моем сценарии. Мне нужен REST API для обработки этой части.
Поле Body параметра s3.upload требует Base64String, а не потоковых данных. Удачи!
Обработчик данных on может быть вызван несколько раз с частичными данными, отладьте и проверьте, соответствует ли это вашему случаю. Также есть ограничение на длину полезной нагрузки для лямбда (я считаю, что это 6 МБ).
@ gusto2 Я пробовал. Вызывается только один раз.
@hoangdv есть идеи, как конвертировать данные?
для кодирования / декодирования вы можете просто выполнить поиск, например здесь - хороший блог. Хотя, насколько я знаю, вы тоже сможете использовать поток, поэтому я не уверен, что другой проблемы нет.





По-вашему - загружать файл на S3 через функцию Lambda не рекомендуется. На мой взгляд, вы можете использовать лямбда-функцию для генерации подписанной ссылки s3, возврата ссылки клиенту, загрузки файла клиентом через подписанную ссылку (способ прямой загрузки файлов S3)