Как вернуть двоичный файл из AWS Lambda с URL-адресом функцииPython

Программы на Python
Ответить
Anonymous
 Как вернуть двоичный файл из AWS Lambda с URL-адресом функции

Сообщение Anonymous »

Я хочу вернуть двоичные файлы (например, изображения, PDF) из функции AWS Lambda с URL-адресом функции. Я не использую API-шлюз.
В документации для возвращаемого объекта мало что сказано о теле или даже о isBase64Encoded.
Шаги по воспроизведению
  • Создайте Lambda (я просто делаю это в консоли)
  • Включите image.png (подойдет любое изображение, если оно не слишком большое).
  • Создайте основной скрипт Python (например, lambda_function.py)

Код: Выделить всё

from base64 import b64encode

with open("image.png", 'rb') as f:
image_b = f.read()

def lambda_handler(event, context):
return {
'statusCode': 200,
'body': image_b,
"headers": {
"content-type": "image/png"
},
}
Теперь я вызываю его из консоли. (т. е. используя API Lambda InvokeFunction, а не URL-адрес функции.)
Я получаю:

Код: Выделить всё

{
"statusCode": 200,
"body": "\ufffdPNG\r\n\u...\ufffd",
"headers": {
"content-type": "image/png"
}
}

Значит, сама лямбда работает. Давайте проверим URL-адрес функции.
Откройте URL-адрес функции в браузере, а также попробуйте загрузить его в файл с помощью Curl.
В Firefox я получаю:
Изображение

Извините за французский. Я снова переключил Firefox на английский, но сообщение об ошибке по какой-то причине все еще на французском языке. В нем говорится:

Изображение не может быть отображено, поскольку оно содержит ошибки.

В Chromium я получаю «разбитое изображение»:
Изображение

(Это не изображение, которое я загрузил.)
Если я сверну файл, откройте его:
Изображение

Я попробовал кодировку base64, чтобы вернуть строку, поскольку в документации упоминается isBase64Encoded.

Код: Выделить всё

def lambda_handler(event, context):
return {
'statusCode': 200,
'body': b64encode(image_b).decode(), # string
"headers": {
"content-type": "image/png"
},
"isBase64Encoded": True
}
Это дает те же результаты.
Является ли, что полезные данные двоичного возврата просто не поддерживаются URL-адресами функции AWS Lambda? Какова цель isBase64Encoded, если не возвращать двоичный код?
Сравнение входных и выходных файлов
Исходный файл имел размер 21,2 КБ. Возвращенный файл имеет размер 38,3 КБ. Поэтому я не думаю, что достигаю какого-либо ограничения на размер возвращаемой полезной нагрузки, и не думаю, что это связано с сжатием. (Возвратную полезную нагрузку невозможно заархивировать.) Если бы URL-адрес лямбда-функции вернул строку в кодировке Base64, это объяснило бы увеличение размера, однако я не думаю, что именно это и произошло.
Когда я сравниваю исходный файл и возвращенный файл с заголовком (по общему признанию, это плохой способ просмотра двоичных файлов), они выглядят одинаково.
Исходный файл:

Код: Выделить всё

�PNG
�
IHDR��|��d�tEXtSoftwaregnome-screenshot��>)tEXtCreation Timejeu. 26 f�vr. 2026 21:40:01��� IDATx��yܝg]�����>۳gOHJ����MY
B,Њ��OAQp�p���H���T`ppWpT�,mѲi)�JۤiҤٞ

Подробнее здесь: [url]https://stackoverflow.com/questions/79897384/how-to-return-binary-from-aws-lambda-with-function-url[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»