如何解决在API网关上将base64字符串作为application / pdf处理为单个端点
正如您所期望的,我们拥有一个具有多个不同端点的API。我们需要添加一个新的端点,该端点将返回application / pdf以及文件数据。
为此,我们返回以下内容:
return {
statusCode: 200,headers: {
'Content-Type': 'application/pdf','Content-disposition': `attachment; filename=${filename}.pdf`,'Accept': 'application/pdf',},body: fileData,isBase64Encoded: true,};
isBase64Encoded
仅在API网关中设置了二进制媒体类型时有效。如此处详述:
https://medium.com/@ngchiwang/aws-api-gateway-lambda-return-binary-image-ba8faa660839
我们遇到的问题是,通过在API网关上将二进制媒体类型设置为* / *(无空格),这反过来会影响API上的所有其他端点。
示例:这会在OPTIONS cors检查中中断一个端点,并无故返回InternalServerErrorException。该端点只是一个GET,请求中没有数据。
这是否意味着我们仅需要为此一个端点使用单独的API,还是有办法将其包含在同一APIG中?
为进一步说明,这是一个在请求{"someValue":1234}
中包含少量JSON的POST,并返回上述application / pdf内容类型。
解决方法
我只是在解决这个问题并像这样解决它:
- 像普通的 json 响应一样发送 base 64 字符串并在客户端处理 pdf 部分
const sendRes = (status:number,body:any) => {
var response = { statusCode: status,headers: { "Content-Type": "application/json" },body: JSON.stringify(body) };
return response;
};
return sendRes(201,{pdf:your-base64-string} );
- 然后在客户端(在我的例子中是 Nuxt):
let res = await this.$store.dispatch('pdf/makePdf')
const linkSource = `data:application/pdf;base64,${res.data.pdf}`;
const downloadLink = document.createElement("a");
const fileName = "your-pdf-filename.pdf";
downloadLink.href = linkSource;
downloadLink.download = fileName;
downloadLink.click();
这会打开一个下载窗口并让您在本地保存文件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。