Ответ 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)
Это все, что нужно.
У меня есть 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 не поддерживает пакетный перенос
Что я делаю неправильно?
Вот решение. Я уже думал о проблеме.
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)
Это все, что нужно.
Boto поддерживает другие сервисы хранения, такие как Google Cloud Storage, в дополнение к S3. Метод set_contents_from_stream работает только для служб, поддерживающих передачу пакетов (см. https://codereview.appspot.com/4515170). S3 не поддерживает это (см. Их технические вопросы в http://aws.amazon.com/articles/1109.)
Это неудачно, но вы не можете загрузить из потока на S3.