【问题标题】:Handling multipart/form-data on API Gateway/Lambda在 API Gateway/Lambda 上处理 multipart/form-data
【发布时间】:2019-02-05 06:25:27
【问题描述】:

我尝试了几种方法,但无法使其正常工作。

客户端(React),我正在使用 POST 发送一个 zip 文件,如下所示,

const data = new FormData();
        data.append('file', file);
        data.append('filename', file.name);

let params = {
            headers: {
                'Content-Type': 'multipart/form-data'
            },
            body: data
        };

服务器端:(API网关/Lambda/Nodejs) 我在网关端的二进制媒体类型中添加了“multipart/form-data”。

通过 lambda event.body 解析时格式不正确。 它看起来像这样:

{"body": "e30=",
"isBase64Encoded": true }

任何想法可能会发生什么?有什么关于如何解析的吗?

【问题讨论】:

  • 服务器端:(API Gateway/Lambda/Nodejs)我在网关端的二进制媒体类型中添加了“multipart/form-data”。你能贴一个这个样本吗?为了更好地澄清。

标签: api lambda multipartform-data gateway serverless


【解决方案1】:

虽然 Ariz 的回答是正确的,但我强烈建议您查看AWS Pre-Signed Upload URLs。它允许您的客户首先将文件上传到 AWS S3 存储桶,您的 lambda 函数稍后可以从该存储桶访问该对象。

尤其是在处理大型二进制文件时,前一种方法可能会导致很多问题(-> 内存问题,这在 Lambda 中是稀疏的)。

我过去写过a short blog post about this

【讨论】:

  • 我绝对考虑过这种方法。唯一的问题是在客户端公开 S3 操作。我觉得在 API Gateway 后面处理这些东西更自在。
  • AWS 打算将预签名上传 URL 用于客户端(例如来自浏览器)。您只需在 API 网关后面生成预签名 URL。那你就不用担心了。
  • 啊,明白了!然后我遇到了这个错误'签名不匹配'。看到这个链接stackoverflow.com/questions/54660048/…
  • 在请求中将文件指定为正文,而不是表单数据。 2.
【解决方案2】:

您正在获取 base64 编码数据,以下是其中一种解码方式。 然而,它是一个空对象。

var base64 = 'e30='
var decodedData = Buffer.from(base64, 'base64').toString();

console.log(decodedData)

【讨论】:

  • 谢谢!我想到了。我只是想把它当作一个缓冲区来处理。没有发生将其转换为字符串。目前我无法解析数据。我正在使用“解析多部分”。它不起作用,或者我可能正在做一些不同的事情。
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 2020-07-14
  • 2020-06-15
  • 2012-10-21
  • 2020-05-11
  • 2015-09-19
  • 2015-12-23
  • 1970-01-01
相关资源
最近更新 更多