Запись потока байтов в s3 с использованием python

У меня есть zip файл, загруженный в память (не сохраняйте его на диске). Zip файл содержит jpg-изображения. Я пытаюсь загрузить каждый jpg в s3, но я получаю сообщение об ошибке.

# already have an opened zipfile stored in zip_file
# already connected to s3

files = zip_file.namelist()

for f in files:
    im = io.BytesIO(zip_file.read(f))
    s3_key.key = f
    s3_key.set_contents_from_stream(im)

Я получаю следующую ошибку:

BotoClientError: BotoClientError: s3 не поддерживает пакетный перенос

Что я делаю неправильно?

Ответ 1

Вот решение. Я уже думал о проблеме.

files = zip_file.namelist()

for f in files:
    data = zip_file.read(f)
    s3_key._key.key = f
    s3_key._key.set_contents_from_string(data)

Это все, что нужно.

Ответ 2

Boto поддерживает другие сервисы хранения, такие как Google Cloud Storage, в дополнение к S3. Метод set_contents_from_stream работает только для служб, поддерживающих передачу пакетов (см. https://codereview.appspot.com/4515170). S3 не поддерживает это (см. Их технические вопросы в http://aws.amazon.com/articles/1109.)

Это неудачно, но вы не можете загрузить из потока на S3.