i有一个端点,该端点在包括文件在内的表单数据。该文件可以是文本文件,图像或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();
}
我已经尝试了在堆栈溢出或github上找到的所有东西,没有运气。
如果您在正面使用API网关。除非您明确启用了二进制媒体类型,否则Apigateway将构造传入的二进制文件。如果您正在使用SLS部署,则可以添加:
apiGateway:
binaryMediaTypes:
- '*/*'
在"提供商"部分
在这里阅读:https://serverless.com/framework/docs/providers/aws/aws/events/apigatewaywaywaywaywaywaywway.binary-media-types
s3是"对象"one_answers"对象"存储。它不知道您的内容是二进制的还是文本或UTF-16编码。它在收到的所有字节时存储所有字节,并在要求时提供服务。
这是我们如何验证问题是在S3上还是使用我们的代码。
- 在本地写二进制文件
- 将同一文件发送到S3
- 从S3 下载
- 验证本地文件哈希和下载文件hash for File Integrity
- 这将帮助您验证二进制文件内容。
希望它有帮助。