Как облегчить загрузку как CSV, так и PDF с API Gateway, подключенного к S3 - PullRequest
0 голосов
/ 15 апреля 2020

В приложении, над которым я работаю, есть процесс, с помощью которого пользователь может загрузить CSV или PDF-версию своих данных. Генерация работает отлично, но я пытаюсь загрузить файл и сталкиваюсь с разными проблемами. Мы используем API Gateway для всех запросов, и генерация происходит внутри лямбды по запросу 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. Мой двоичныйMediaTypes просто имеет application/pdf и все. Моя цель - заставить это работать без необходимости выгрузки проблемы в лямбду, чтобы у нас не было таких накладных расходов на этапе загрузки. Есть идеи, как сделать это правильно?

Так же, как еще один комментарий, я попробовал CONVERT_TO_BINARY и просто оставил его как Passthrough. Я пробовал это с text/csv как другой тип двоичного носителя, и я пробовал разные комбинации кодирования и декодирования base64 и прочего. Я знаю, что данные возвращаются прямо с S3, но преобразование - то, где оно ломается. Я рад опубликовать больше журналов, если это будет необходимо. Кроме того, я почти уверен, что это имеет смысл для StackOverflow, но если он лучше подходит для другого сайта StackExchange, пожалуйста, дайте мне знать.

Ресурсы, на которые я смотрел:

РЕДАКТИРОВАТЬ: Одна идея, которая у меня была, - сделать CONVERT_TO_BINARY и каким-то образом base64 кодировать CSV в преобразовании, но я не могу понять, как это сделать правильно. Я продолжаю чувствовать, что я неправильно понимаю порядок вещей, особенно когда происходит "CONVERT" часть. Если это имеет какой-то смысл.

РЕДАКТИРОВАТЬ 2: Итак, я избавился от $util.base64Encode в PDF, и теперь у меня есть пустой PDF. В настоящем файле S3 определенно есть что-то, но по какой-то причине CONVERT_TO_TEXT не справляется с этим правильно, или я все еще не понимаю, как все это работает.

...