import boto3
from io import StringIO
s3 = boto3.client('s3')
display = # Altair Charting
buff = StringIO(display.save(str_obj, 'html'))
s3.upload_fileobj(buff.read(), BUCKET, 'index.html')
Я думаю, что полный пример усложнит проблему, поэтому я оставил комментарии Альтаира закомментированными.
Во всяком случае, я пытался реализовать огромное количество предложений по сохранению объектов и файлов в корзины AWS S3, но я не понимаю.
Сохранение на диск так же просто, как:
display.save('index.html')
Получение этого на S3 кажется чрезвычайно трудным сравнением. Я не уверен, что мне здесь не хватает. Возможно, upload_fileobj
- это не правильный метод, но я пытался заставить эту работу работать вокруг себя.
Специфическая ошибка этого метода: ValueError: Fileobj must implement read
UPDATE:
buff = StringIO(display.save('str.html'))
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buff.read()
)
Результаты в 0-байтовом файле index.html
в моем Bucket
ОБНОВЛЕНИЕ 2:
str_obj = StringIO()
display.save(str_obj, 'html')
buff = str_obj.read()
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buff
)
Это тоже не работает. Я просто не могу поверить, что сохранение файла на S3 это сложно. Оглядываясь назад: у меня не было метода getvalue()
, необходимого для buff
РЕШЕНИЕ:
Это не первый раз, когда я боролся с файлами S3, поэтому я, вероятно, оставляю это для моего собственного будущего использования. Тем не менее, мне до сих пор не ясно, почему я не смог сохранить файл .html в виде строки.
import boto3
from io import StringIO
s3 = boto3.client('s3')
display = # Altair Charting
str_obj = StringIO() # instantiate in-memory string object
display.save(str_obj, 'html') # saving to memory string object
buf = str_obj.getvalue().encode() # convert in-memory string to bytes
# Upload as bytes
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buf
)