Сценарий: файл изображения, хранящийся в корзине GCP, должен быть отправлен сторонней конечной точке REST через POST
Вопрос: Это действительно так? лучший образец? Есть ли более эффективный, менее многословный способ?
У нас есть изображения, загружаемые мобильным приложением в корзину GCP Storage. Когда происходит событие завершения для загрузки изображения, у нас есть облачная функция GCP (Python 3), которая реагирует на это, получая ссылку на загруженное изображение, загружает его во временный файл, а затем использует этот временный файл в качестве источника изображения для ПОСТ. Это наш текущий код, и он работает, но, на мой взгляд, он запутан несколькими командами open
. Более конкретно: есть ли лучший способ просто получить блоб изображения из GCP Storage и просто присоединить его к вызову POST, не сохраняя его сначала как локальный файл, а затем открывая его, чтобы его можно было присоединить к POST?
def third_party_upload(data, context):
# get image from bucket
storage_client = storage.Client()
bucket = storage_client.bucket(data['bucket'])
image_blob = bucket.get_blob(data['name'])
download_path = '/tmp/{}.jpg'.format(str(uuid.uuid4())) #temp image file download location
# save GCP Storage blob as a temp file
with open(download_path, 'wb') as file_obj:
image_blob.download_to_file(file_obj)
# open temp file and send to 3rd-party via rest post call
with open(download_path, 'rb') as img:
files = {'image': (data['name'], img, 'multipart/form-data', {'Expires': '0'}) }
headers = {
'X-Auth-Token': api_key,
'Content-Type': 'image/jpg',
'Accept': 'application/json'
}
# make POST call
response = requests.post(third_party_endpoint, headers=headers, files=files)
print('POST response:', response)
Обновление: несколько комментаторов отметили, что подписанные URL-адреса возможны, и я согласен, что они являются отличным выбором. Однако мы застряли с требованием включить двоичный файл изображения в качестве тела POST. Подписанные URL не будут работать в этом случае.