【发布时间】:2012-12-30 01:02:19
【问题描述】:
我在 Python Web 环境中工作,我可以使用 boto 的 key.set_contents_from_filename(path/to/file) 简单地将文件从文件系统上传到 S3。不过,我想上传一张已经在网络上的图片(比如https://pbs.twimg.com/media/A9h_htACIAAaCf6.jpg:large)。
我应该以某种方式将图像下载到文件系统,然后像往常一样使用 boto 将其上传到 S3,然后删除图像吗?
理想的情况是,如果有一种方法可以获取 boto 的 key.set_contents_from_file 或其他可以接受 URL 并将图像很好地流式传输到 S3 的命令,而无需将文件副本显式下载到我的服务器。
def upload(url):
try:
conn = boto.connect_s3(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
bucket_name = settings.AWS_STORAGE_BUCKET_NAME
bucket = conn.get_bucket(bucket_name)
k = Key(bucket)
k.key = "test"
k.set_contents_from_file(url)
k.make_public()
return "Success?"
except Exception, e:
return e
使用 set_contents_from_file,如上所述,我收到“字符串对象没有属性 'tell'”错误。将 set_contents_from_filename 与 url 一起使用,我得到一个 No such file or directory 错误。 boto storage documentation 没有提到上传本地文件,也没有提到上传远程存储的文件。
【问题讨论】:
-
您只是想避免写入磁盘吗?或者您是否试图完全避免将文件传输到您的机器上?
-
嗯,理想情况下,可以将 URL 传递给 S3,这样我的服务器就不必写入磁盘或加载到内存中。我认为这不是对 S3 服务的合理期望。如果我的服务器必须处理这个问题,我不想写入磁盘。
标签: python django amazon-s3 boto