AWS API GATEWAY配置以从Lambda返回二进制pdf文件

时间:2018-09-03 21:37:51

标签: amazon-web-services pdf binary base64 aws-api-gateway

我想从AWS Lambda函数返回pdf,并且我使用API​​ Gateway从任何浏览器中调用它。

我在c#中有一个aws lambda函数,它返回一个API网关响应,其主体是pdf中的base64 encoded string

到目前为止,端点返回的文件扩展名为.pdf,但不是二进制文件。而是带有base64字符串的文本文件。

我从C#代码返回的标头是:

  var headersDic = new Dictionary<string, string>();
      headersDic.Add("Content-type", "application/pdf");
      headersDic.Add("Content-disposition", "attachment; filename=file.pdf");

我将base64字符串手动转换为二进制文件并以pdf格式打开,并且它可以工作,我的意思是base64字符串正确,因此我认为问题出在API网关上。

在API网关的集成响应控制台中,我得到了:

enter image description here

但是我无法使其工作。

我还启用了二进制媒体类型。

enter image description here

3 个答案:

答案 0 :(得分:0)

我不知道我到底做了什么,但是我删除了'ALL'方法,并使用此配置创建了'GET'方法,现在它可以工作了。

enter image description here

答案 1 :(得分:0)

您还需要在LambdaEntryPoint.cs

中声明以下内容类型

请参阅此文档:https://github.com/aws/aws-lambda-dotnet/blob/master/Libraries/src/Amazon.Lambda.AspNetCoreServer/README.md

您必须告诉Lambda您将返回字符串以外的东西。

public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{

    protected override void Init(IWebHostBuilder builder)
    {
        builder
            .UseStartup<Startup>();

        ****IMPORTANT PART HERE****
        RegisterResponseContentEncodingForContentType("application/pdf",
            ResponseContentEncoding.Base64);
    }
}

答案 2 :(得分:0)

响应标题

'Content-Type': 'application/pdf'
'Content-disposition', 'attachment; filename=fileName.pdf'

对客户的回应

{
 statusCode: 200
 headers: responseHeader,
 body: pdfContent.toString(base64),
 isBase64Encoded: true,
}

API网关二进制媒体类型

enter image description here

希望这会有所帮助