无服务器框架 - 将二进制文件上传到S3会损坏

时间:2018-03-30 17:16:18

标签: node.js amazon-s3 serverless busboy

我有一个端点,它接收包含文件的表单数据。该文件可以是文本文件,图像或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上找到的所有东西,但没有运气。

2 个答案:

答案 0 :(得分:2)

如果您在前面使用API​​网关。除非您专门启用了二进制媒体类型,否则apiGateway会处理传入的二进制文件。 如果您使用SLS进行部署,则只需添加:

apiGateway:
  binaryMediaTypes:
  - '*/*'

在提供商部分

在这里阅读:https://serverless.com/framework/docs/providers/aws/events/apigateway#binary-media-types

答案 1 :(得分:1)

S3是"中的"对象。和#34;反对"商店。它不知道您的内容是二进制还是文本或utf-16编码。它在收到时存储所有字节,并在请求时提供它们。

以下是我们如何验证问题是在S3还是在我们的代码上。

  1. 在本地编写二进制文件
  2. 将相同的文件发送到S3
  3. 从S3下载
  4. 验证本地文件哈希并下载文件哈希以确保文件完整性
  5. 这将帮助您验证二进制文件内容。
  6. 希望它有所帮助。