不使用Lambda能否通过AWS API Gateway上传form-data文件至S3?
API Gateway 直连S3 无Lambda上传方案配置
multipart/form-data 格式图片上传配置
直接按以下步骤配置即可,全程不需要Lambda参与:
- 先在API Gateway控制台对应API的「设置」页,将
multipart/form-data添加到二进制媒体类型列表,否则API会自动将二进制请求体做Base64转码,导致上传到S3的文件损坏。 - 新建API方法,集成类型选择「AWS服务」,关联的AWS服务选择S3,HTTP方法配置为
POST,对应S3原生的PostObject接口,该接口原生支持解析multipart/form-data格式的上传请求。 - 配置集成请求的IAM角色,给角色绑定目标S3存储桶的
s3:PutObject权限,确保API有权限向S3写入对象。 - 在集成请求的HTTP请求头映射规则中,添加透传规则:将客户端请求携带的
Content-Type头原样转发给S3。这步漏了100%上传失败:multipart请求的boundary分隔符参数带在Content-Type头里,不透传的话S3根本不知道怎么拆分请求体,直接报解析错误。 - 关闭方法请求的请求体模型校验,请求体映射选择「透传」,不要对请求内容做任何模板转换,避免破坏multipart结构。
- 配置CORS规则时,将
Content-Type加入允许的请求头列表,确保浏览器端表单上传不会被跨域策略拦截。
别用API Gateway控制台自带的测试功能测multipart上传,那个测试工具会自动篡改Content-Type里的boundary值,测出来全是错的,直接用Postman或者实际前端页面发请求测就行。
无Lambda实现上传大小、格式限制
完全不需要Lambda,通过API Gateway+S3的原生能力就能实现两层校验:
- 大小限制配置
- API Gateway层:在API的设置页找到「有效负载大小限制」配置项,可自定义阈值(单位为字节),最大支持10MB(和API Gateway的硬上限一致),超过阈值的请求会被API直接返回
413 Payload Too Large,不会转发到S3。如果用的是HTTP API类型,还可以给单个上传路由单独配置大小阈值,粒度更细。 - S3层:在存储桶策略中添加
s3:ContentLengthRange条件,配置允许上传的对象字节数上下限,不符合大小要求的请求会被S3直接返回403拒绝,作为兜底校验。
- API Gateway层:在API的设置页找到「有效负载大小限制」配置项,可自定义阈值(单位为字节),最大支持10MB(和API Gateway的硬上限一致),超过阈值的请求会被API直接返回
- 格式限制配置
- API Gateway层:配置方法请求的请求头校验规则,对
Content-Type头加正则匹配,要求必须匹配^multipart/form-data;.*规则,非multipart请求直接拦截返回400。 - S3层:在存储桶策略中添加
s3:Content-Type条件,枚举允许上传的图片MIME类型(比如image/png、image/jpeg、image/webp),不符合类型要求的上传请求会被直接拦截。如果需要校验文件真实格式而非仅校验后缀/MIME,可开启S3托管的恶意文件检测功能,不需要自定义代码。
- API Gateway层:配置方法请求的请求头校验规则,对
内容的提问来源于stack exchange,提问作者pityo10000
相关产品推荐
相关产品推荐

