【发布时间】:2023-03-15 00:33:02
【问题描述】:
在我正在开发的应用程序中,我们有一个流程,用户可以通过该流程下载其数据的 CSV 或 PDF 版本。这一代效果很好,但我试图让它下载文件并遇到各种问题。我们对所有请求都使用 API Gateway,并且生成发生在 Lambda 中的 POST 请求上。 GET 端点接受 file_name 参数,然后在 S3 中构造路径,然后直接在那里发出请求。我遇到的问题是当我试图转换响应时。我收到 500 错误,当我查看日志时,它显示 Execution failed due to configuration error: Unable to transform response。所以,很明显,这是我大部分时间都花在这上面的地方。我已经尝试了至少 50 次不同的模板和组合迭代,但收效甚微。我得到的最接近的是以下代码,CSV 下载正常,但 PDF 不再是有效的 PDF:
CSV:
#set($contentDisposition = "attachment;filename=${method.request.querystring.file_name}")
$input.body
#set($context.responseOverride.header.Content-Disposition = $contentDisposition)
PDF:
#set($contentDisposition = "attachment;filename=${method.request.querystring.file_name}")
$util.base64Encode($input.body)
#set($context.responseOverride.header.Content-Disposition = $contentDisposition)
在哪里contentHandling = CONVERT_TO_TEXT。我的 binaryMediaTypes 只有application/pdf,仅此而已。 我的目标 是在无需将问题卸载到 Lambda 的情况下使其正常工作,因此我们在下载步骤中没有这种开销。任何想法如何正确地做到这一点?
正如另一条评论,我试过CONVERT_TO_BINARY 并将其保留为Passthrough。我已经尝试使用text/csv 作为另一种二进制媒体类型,并且尝试了编码和解码 base64 和其他内容的不同组合。我知道数据是从 S3 中返回的,但是转换是中断的地方。如果需要,我很乐意发布更多日志。另外,我很确定这在 StackOverflow 上是有意义的,但如果它更适合另一个 StackExchange 站点,请告诉我。
我看过的资源:
- https://docs.aws.amazon.com/apigateway/latest/developerguide/request-response-data-mappings.html
- https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html#util-template-reference
- https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html
- https://docs.amazonaws.cn/en_us/apigateway/latest/developerguide/api-gateway-payload-encodings-configure-with-control-service-api.html。
- (但它们都太混乱了……)
编辑: 我的一个想法是做CONVERT_TO_BINARY 并以某种方式对转换中的CSV 进行base64 编码,但我不知道如何正确地做到这一点。我一直觉得我误解了事情的顺序,特别是当“转换”部分发生时。如果这有任何意义。
编辑 2: 所以,我删除了 PDF 文件中的 $util.base64Encode,现在我有了一个空的 PDF。 S3 中的实际文件肯定有东西,但由于某种原因 CONVERT_TO_TEXT 没有正确处理它,或者我仍然不了解这一切是如何工作的。
【问题讨论】:
标签: amazon-web-services csv pdf amazon-s3 api-gateway