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

标签 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 上找到的所有内容,但没有成功。

最佳答案

如果你在前端使用API​​网关。 apiGateway 将破坏传入的二进制文件,除非您专门启用二进制媒体类型。 如果您使用 SLS 进行部署,那么您只需添加:

apiGateway:
  binaryMediaTypes:
  - '*/*'

在供应商部分

阅读此处:https://serverless.com/framework/docs/providers/aws/events/apigateway#binary-media-types

关于node.js - 无服务器框架 - 将二进制文件上传到 S3 会损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49578569/

相关文章:

node.js - 在无服务器阶段之间重用相同的 s3 存储桶

node.js - AWS Lambda 函数错误 : Cannot find module 'lambda'

javascript - 如何在 Netlify Serverless 功能中设置 CORS

node.js - Raspberry pi在启动时加载应用程序/Raspberry pi cargar应用程序已启动

node.js - expressjs 和 socket.io - 客户端上的重复消息

node.js - 是否可以将文件发布到 MQTT 服务器?

amazon-s3 - 学习 Amazon Web Services 的好书

amazon-web-services - 禁用进度输出 aws s3 同步而不禁用所有输出

javascript - ECONNREFUSED : Connection refused. 为什么?所有其他测试均通过

ios - 上传后从存储桶 Amazon Web Service iOS 获取图像 URL