Безсерверная структура - загрузка бинарных файлов на S3 становится поврежденной
У меня есть конечная точка, которая принимает данные формы, включая файл. Этот файл может быть текстовым файлом, изображением или PDF. Я использую busboy (v0.2.14) для анализа данных формы. Этот код выглядит так:
let buffers = [];
file.on('data', data => buffers.push(data));
file.on('end', () => {
result.filename = filename;
result.contentType = mimetype;
// Concat the chunks into a Buffer
result.file = new Buffer.concat(buffers);
});
// ...
busboy.write(event.body, event.isBase64Encoded ? 'base64' : 'binary');
busboy.end();
Однако когда я передаю данные файла до S3 с помощью AWS SDK (v2.97.0), все двоичные файлы повреждаются, когда я их просматриваю. Это не происходит с текстовыми файлами. Код загрузки S3 выглядит следующим образом:
static myPutObject(bucketName, fileName, data, contentType, acl) {
const params = {
Bucket: bucketName,
Key: fileName,
Body: data,
ACL: acl,
ContentType: contentType,
ContentEncoding: 'base64'
};
return new AWS.S3().putObject(params).promise();
}
Я безуспешно перепробовал все, что смог найти на Stack Overflow или GitHub.
1 ответ
Если вы используете шлюз API спереди. apiGateway будет искажать входящий двоичный файл, если вы специально не включили двоичные типы носителей. Если вы используете SLS для развертывания, вы можете просто добавить:
apiGateway:
binaryMediaTypes:
- '*/*'
в разделе провайдера
Читайте здесь: https://serverless.com/framework/docs/providers/aws/events/apigateway
S3 - это хранилище "объект в" и "объект из". Он не знает, является ли ваш контент бинарным или текстовым или в кодировке utf-16. Он хранит все байты по мере их поступления и обслуживает их по запросу.
Вот как мы проверили, есть ли проблема на S3 или с нашим кодом.
- Написать бинарный файл локально
- Отправить тот же файл на S3
- Скачать с S3
- Проверьте хеш локального файла и скачайте хэш для целостности файла
- Это поможет вам проверить содержимое двоичного файла.
Надеюсь, поможет.