Проверка работоспособности Python / GCP: это правильный способ ссылки на изображение, хранящееся в GCP Storage при вызове POST - PullRequest
1 голос
/ 05 февраля 2020

Сценарий: файл изображения, хранящийся в корзине 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 не будут работать в этом случае.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

HTTP-метод POST требует данных. Вы должны предоставить эти данные в запросе HTTP. Для получения данных Cloud Storage не существует метода magi c, кроме как для их чтения. Процесс состоит в том, чтобы прочитать данные из облачного хранилища и затем предоставить эти данные в запрос POST.

0 голосов
/ 05 февраля 2020

Если вы можете отправить URL-адрес сторонней конечной точке вместо фактического содержимого изображения, вы можете использовать подписанные URL-адреса для предоставления ограниченного по времени доступа к изображению без необходимости предоставлять сторонний доступ к корзине или сделать ведро публикуемым c.

Больше информации здесь: https://cloud.google.com/storage/docs/access-control/signed-urls

...