我使用serverless创建了一个lambda函数。此函数在GET请求上通过API网关触发,并应从缓冲区返回pdf文件。我正在使用html-pdf创建缓冲区并尝试使用以下命令返回pdf文件
let response = {
statusCode: 200,
headers: {'Content-type' : 'application/pdf'},
body: buffer.toString('base64'),
isBase64Encoded : true,
};
return callback(null, response);
但是浏览器只是无法加载pdf,所以我不确切知道如何将pdf文件直接返回到浏览器。无法找到解决方案。
答案 0 :(得分:14)
API GATEWAY
FRONTEND
在新标签中打开api url(target =" _blank")。可能浏览器正在处理编码的base 64响应。在我的chrome案例中,浏览器只是在新标签页中打开pdf,就像我想要的那样。
答案 1 :(得分:5)
如果您有一个巨大的PDF,那么Lambda将需要很长时间才能退回,而在Lambda中,您需要每100毫秒收费。
我先将它保存到S3,然后让Lambda将S3网址返回给客户端进行下载。
答案 2 :(得分:5)
在此上花费了几个小时后,我发现如果将Content handling
设置为Convert to binary
(CONVERT_TO_BINARY),则整个响应必须为base64,否则我将得到一个错误:Unable to base64 decode the body
因此,我的回复现在看起来像:
callback(null, buffer.toString('base64'));
集成响应:
方法响应:
和二进制媒体类型:
答案 3 :(得分:0)
以上解决方案仅适用于特定的内容类型。您不能再输入更多内容类型。 请仅按照以下两步操作来解决多种内容类型问题。
API网关-> API->方法->集成请求
以
创建您的回复让响应= {
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;
注意*-不安全