Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS Lambda无法返回PDF文件_Node.js_Amazon Web Services_Lambda_Aws Api Gateway_Serverless Framework - Fatal编程技术网

Node.js AWS Lambda无法返回PDF文件

Node.js AWS Lambda无法返回PDF文件,node.js,amazon-web-services,lambda,aws-api-gateway,serverless-framework,Node.js,Amazon Web Services,Lambda,Aws Api Gateway,Serverless Framework,我使用创建了一个lambda函数。此函数在GET请求时通过API网关启动,并应从缓冲区返回pdf文件。我正在使用创建缓冲区,并尝试使用以下命令返回pdf文件 let response = { statusCode: 200, headers: {'Content-type' : 'application/pdf'}, body: buffer.toString('base64'), isBase64Encoded : true, }; return c

我使用创建了一个lambda函数。此函数在GET请求时通过API网关启动,并应从缓冲区返回pdf文件。我正在使用创建缓冲区,并尝试使用以下命令返回pdf文件

  let response = {
    statusCode: 200,
    headers: {'Content-type' : 'application/pdf'},
    body: buffer.toString('base64'),
    isBase64Encoded : true,
  };
  return callback(null, response);

但是浏览器无法加载pdf,所以我不知道如何将pdf文件直接返回到浏览器。找不到解决方案。

如果您有一个巨大的PDF,那么Lambda将需要很长时间才能返回它,并且在Lambda中,您每100毫秒计费一次

我会先将其保存到S3,然后让Lambda将S3URL返回给客户端进行下载。

我找到了答案。 我的响应对象中的设置很好,我只需手动更改API网关中的设置即可在浏览器中工作。我在API网关控制台的二进制设置下为二进制媒体类型添加了“*/*”

API网关

  • 只要登录到你的控制台
  • 选择您的api
  • 单击下拉列表中的二进制支持
  • 编辑二进制媒体类型并添加“*/*”
  • 前端


    在新选项卡中打开api url(target=“\u blank”)。可能浏览器正在处理编码的Base64响应,在我使用chrome的情况下,浏览器只是在一个新选项卡中打开pdf,就像我希望的那样。

    花了几个小时之后,我发现如果您将
    内容处理设置为
    转换为二进制(转换为二进制)整个响应必须是base64,否则我将得到一个错误:
    无法base64解码正文

    因此,我现在的回答是:

    回调(null,buffer.toString('base64')

    整合回应:

    方法响应:

    和二进制媒体类型:


    上述解决方案仅适用于特定内容类型。您不能使用更多的内容类型。 仅按照以下两步解决多内容类型问题

  • 单击“使用Lambda代理集成”复选框
  • API网关-->API-->方法-->集成请求

  • 将您的响应创建为

        let response = {
    
          statusCode: 200,
          headers: {
            'Content-type': 'application/pdf',//you can change any content type
            'content-disposition': 'attachment; filename=test.pdf' // key of success
          },
          body: buffer.toString('base64'),
          isBase64Encoded: true
        };
        return response;
    

  • 注意*-它不安全

    我对Base64编码很好奇。有必要吗?也许这就是问题所在?我将以二进制格式返回数据。我尝试了一些变体(也没有bas64编码)。这个建议来自下面的链接:上传到s3的过程不会花费同样多的时间吗?谢谢你的建议,但我必须直接下载该文件还有6MB的响应
    正文
    大小限制需要注意。你能分享1)API网关上到底做了哪些更改2)你如何在客户端处理base64编码的响应字符串吗?@Shuki刚刚更新了答案,希望这也适用于you@sami_analyst这对我来说非常有效,谢谢,奇怪的是,当我上传pdf时,“application/pdf”不起作用。我将二进制媒体类型设置为“application/pdf”,并确保API网关方法响应包含“200”的HTTP状态,响应体内容类型为“application/pdf”(空模型)。加上“500”的HTTP状态,响应正文内容类型为“text/plain”(空模型),用于发生错误时。@HarisMehmood我将wkhtmltopdf分离到它自己的lambda函数中,并有一个dotnet core webapi调用该lambda函数以获取base64编码字符串。然后,我用UTF8将该字符串解码为一个字节[],并将其作为文件从WebApi返回。我的问题是,来自webapi的响应是一个无效的pdf文件。这是在我在apiGateway的设置页面中添加了以下二进制媒体类型后修复的:*/*以及添加了内容类型为“application/pdf”和“Empty”的200 OK方法响应。并重新部署了API网关。让我知道为您修复了它如果您采用SAM方式,请添加以下行
    Globals:Api:BinaryMediaTypes:-application~1pdf
    您可以在无服务器框架中添加二进制媒体类型,请参见此处