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

Eri*_*our 5 amazon-s3 node.js busboy serverless

我有一个端点,它接收包括文件在内的表单数据。该文件可以是文本文件、图像或 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();
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 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();
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了 Stack Overflow 或 GitHub 上能找到的所有方法,但没有成功。

Kan*_*yan 1

S3 是“对象输入”和“对象输出”存储。它不知道您的内容是二进制、文本还是 utf-16 编码。它会存储接收到的所有字节,并根据请求提供服务。

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

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

希望能帮助到你。