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')
我认为如果提供完整的示例,会使问题更加复杂,因此我将Altair图表保留为注释。
无论如何,我尝试了大量将对象和文件保存到AWS S3存储桶的建议,但是我还没有理解。
保存到磁盘很简单:
display.save('index.html')
将此内容上传到S3相比之下似乎非常困难。我不确定我在哪里出了问题。也许
upload_fileobj
不是正确的方法,但我已经尝试了多次,仍然无法使其正常工作。使用此方法时,特定错误为
ValueError: Fileobj必须实现read
更新:buff = StringIO(display.save('str.html'))
s3.put_object(
Bucket=BUCKET,
Key=f'{DASHBOARD}{mkt_type}/{symbol}/index.html',
Body=buff.read()
)
我的Bucket中的index.html
文件大小为0字节。
更新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
)