【问题标题】:Serverless I image upload to S3 broken after deploy, local worked only部署后无服务器 I 图像上传到 S3 损坏,仅本地工作
【发布时间】:2020-07-15 02:48:14
【问题描述】:

我尝试使用serverless 和 NodeJS 将图像上传到 S3,但上传后出现问题。在本地使用 serverless-offline 一切都像冠军一样工作,但部署后我得到了这个错误。然后我尝试拦截并检测发生了什么,并看到了这样的结果:

图片正文中出现<0x0a>0x010x04等奇怪字符

我也尝试使用serverless-apigw-binary,但运气不佳。

【问题讨论】:

  • 您是否在 AWS Lambda 前使用了 API 网关?你如何调用无服务器函数?
  • 是的,我正在使用 NestJS。类似return serverless.proxy(server, event, context);
  • 不,我的意思是AWS API Gateway,如果你使用它,你需要允许文件类型@AWS API Gateway。
  • 是的,我正在使用 AWS API Gateway。
  • 我刚刚找到了解决方案。感谢@xion

标签: aws-lambda serverless image-upload


【解决方案1】:

自我回答

非常幸运,我刚刚在以下位置找到了解决方案 binary-media-types

将此添加到serverless.yml

provider:
  # others
  apiGateway:
    binaryMediaTypes:
      - '*/*'

不需要serverless-apigw-binary

这个也不需要

const binaryMimeTypes = [
  'image/gif',
  'image/png',
  'image/jpeg',
  'image/jpg',
];
...

return serverless.createServer(expressApp, null, binaryMimeTypes)

【讨论】:

  • 我应该在请求中添加标头吗?我被 stackoverflow.com/questions/69810751/… 屏蔽了,你能帮我解决这个问题吗
  • 您可以尝试调试 API 端 console.log blob 文件发生的情况。或者下载上传的文件并检查文件内容/信息,看看发生了什么。
  • 无服务器不支持这个。
【解决方案2】:

以下方法对我有用。

如果想通过 lambda 上传文件,一种方法是打开您的 AWS API Gateway 控制台。

前往

“API”-> {YourAPI}->“设置”

在那里你会找到“二进制媒体类型”部分。

添加以下媒体类型:

多部分/表单数据

保存您的更改。

然后转到“资源”->“代理方法”(例如“ANY”)->“方法请求”->“HTTP 请求标头”并添加以下标头“Content-Type”、“接受”。

最后部署你的 api。

欲了解更多信息,请访问:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-console.html

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2021-08-21
    • 2016-09-28
    • 2019-05-06
    • 1970-01-01
    • 2016-04-14
    • 2021-03-15
    相关资源
    最近更新 更多