除其他事项外,我正在使用绘图matplotlib
,我想立即将其存储为 S3 对象。
根据中提供的答案this https://stackoverflow.com/q/33771318/1129682 and 这个其他 https://stackoverflow.com/q/40336918/1129682问题和精美手册 http://boto3.readthedocs.io/en/latest/reference/services/s3.html#object, 我需要S3.Object.put()
将我的数据转移到AWS,过程应该是这样的
from matplotlib import pyplot as plt
import numpy as np
import boto3
import io
# plot something
fig, ax = plt.subplots()
x = np.linspace(0, 3*np.pi, 500)
a = ax.plot(x, np.sin(x**2))
# get image data, cf. https://stackoverflow.com/a/45099838/1129682
buf = io.BytesIO()
fig.savefig(buf, format="png")
buf.seek(0)
image = buf.read()
# put the image into S3
s3 = boto3.resource('s3', aws_access_key_id=awskey, aws_secret_access_key=awssecret)
s3.Object(mybucket, mykey).put(ACL='public-read', Body=image)
然而,我最终得到了一个内容长度为零的新 S3 对象。
下面给出了一个内容长度为 6 的新 S3 对象。
s3.Object(mybucket, mykey).put(ACL='public-read', Body="foobar")
当我放置下一行时,我最终得到 S3 对象中的内容,但它不是可用的图像:
s3.Object(mybucket, mykey).put(ACL='public-read', Body=str(image))
我可以通过查看实际文件来使其工作,如下所示:
with open("/tmp/iamstupid","wb") as fh:
fig.savefile(fh, format="png")
s3.Bucket(mybucket).upload_file("/tmp/iamstupid", mykey)
所以这似乎有效。我只是无法正确使用该界面。我究竟做错了什么?我怎样才能使用实现我的目标S3.Object.put()