无服务器框架 - 将二进制文件上传到 S3 会损坏
Serverless framework - uploading binary files to S3 become corrupted
我有一个接收表单数据(包括文件)的端点。此文件可以是文本文件、图像或 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();
但是,当我使用AWS SDK (v2.97.0) 将文件数据推送到S3时,当我去查看它们时,所有二进制文件都已损坏。这不会发生在文本文件上。 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 上可以找到的所有内容,但没有成功。
S3 是 "object in" 和 "object out" 商店。它不知道您的内容是二进制还是文本还是 utf-16 编码。它存储所有接收到的字节并在请求时提供它们。
以下是我们验证问题是出在 S3 上还是出在我们的代码上的方法。
- 在本地写入二进制文件
- 将相同的文件发送到 S3
- 从 S3 下载
- 验证本地文件哈希和下载文件哈希的文件完整性
- 这将帮助您验证二进制文件内容。
希望对您有所帮助。
如果您在前端使用 API 网关。 apiGateway 将破坏传入的二进制文件,除非您专门启用二进制媒体类型。
如果您使用 SLS 进行部署,那么您只需添加:
apiGateway:
binaryMediaTypes:
- '*/*'
在提供商部分
阅读此处:https://serverless.com/framework/docs/providers/aws/events/apigateway#binary-media-types
我有一个接收表单数据(包括文件)的端点。此文件可以是文本文件、图像或 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();
但是,当我使用AWS SDK (v2.97.0) 将文件数据推送到S3时,当我去查看它们时,所有二进制文件都已损坏。这不会发生在文本文件上。 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 上可以找到的所有内容,但没有成功。
S3 是 "object in" 和 "object out" 商店。它不知道您的内容是二进制还是文本还是 utf-16 编码。它存储所有接收到的字节并在请求时提供它们。
以下是我们验证问题是出在 S3 上还是出在我们的代码上的方法。
- 在本地写入二进制文件
- 将相同的文件发送到 S3
- 从 S3 下载
- 验证本地文件哈希和下载文件哈希的文件完整性
- 这将帮助您验证二进制文件内容。
希望对您有所帮助。
如果您在前端使用 API 网关。 apiGateway 将破坏传入的二进制文件,除非您专门启用二进制媒体类型。 如果您使用 SLS 进行部署,那么您只需添加:
apiGateway:
binaryMediaTypes:
- '*/*'
在提供商部分
阅读此处:https://serverless.com/framework/docs/providers/aws/events/apigateway#binary-media-types