Node.js AWS Lambda无法返回PDF文件
我使用创建了一个lambda函数。此函数在GET请求时通过API网关启动,并应从缓冲区返回pdf文件。我正在使用创建缓冲区,并尝试使用以下命令返回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
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 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
您可以在无服务器框架中添加二进制媒体类型,请参见此处