You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:58