使用C# Lambda注解向S3上传PDF二进制文件失败的解决方法
解决C# Lambda Annotations上传二进制PDF文件的问题
问题根源
- 使用
[FromBody] byte[]时,Lambda Annotations默认的模型绑定器仅支持JSON格式请求体,二进制PDF的请求体不属于JSON,导致绑定失败返回500,且绑定阶段的错误未被Lambda日志捕获。 - 改用
string类型接收时,二进制数据会被按UTF-8编码强制转换为字符串,写入S3时又反向编码,破坏了原始二进制结构,导致生成的PDF文件无效。
正确解决方案
方案1:使用APIGatewayProxyRequest直接处理原始二进制数据
通过APIGatewayProxyRequest获取API Gateway传递的base64编码请求体,解码后得到原始二进制数据,再通过流的方式上传到S3(避免编码问题):
[LambdaFunction(Policies = "AWSLambdaBasicExecutionRole", MemorySize = 1024, Timeout = 5)] [RestApi(LambdaHttpMethod.Post, "/")] public async Task<IHttpResult> Post( APIGatewayProxyRequest request, [FromQuery] string fileName, ILambdaContext context) { // 将base64编码的请求体解码为原始二进制数组 byte[] fileContent = Convert.FromBase64String(request.Body); // 使用内存流上传到S3,确保二进制数据完整 using (var contentStream = new MemoryStream(fileContent)) { await _s3Client.PutObjectAsync(new PutObjectRequest { BucketName = S3BucketName, Key = fileName, InputStream = contentStream, ContentType = "application/pdf" // 指定正确的MIME类型,确保S3识别文件格式 }); } return HttpResults.Created(); }
方案2:配置API Gateway支持二进制媒体类型
为了让API Gateway正确传递二进制请求体,需要在控制台进行以下配置:
- 进入API Gateway控制台,找到目标API
- 切换到Settings标签页,在Binary Media Types中添加
application/pdf和application/octet-stream - 重新部署API,确保配置生效
配置完成后,API Gateway会将二进制请求体以base64编码的形式传递给Lambda,此时APIGatewayProxyRequest.Body就是正确的base64字符串,解码后即可得到原始PDF二进制数据。
关键注意事项
- 上传S3时必须使用
InputStream而非ContentBody,ContentBody仅适用于文本内容,会对二进制数据进行编码转换,导致文件损坏。 - 务必指定
ContentType为application/pdf,确保S3和下游服务能正确识别文件类型。
内容的提问来源于stack exchange,提问作者beautifulcoder
相关产品推荐
相关产品推荐

