使用Django将图片上传到Amazon S3

5

当用户上传图片时,我目前正在动态调整图片的大小。原始图片存储在名为djangobucket的Amazon S3存储桶中。在这个桶中,包含数千个文件夹。

每个文件夹都以用户的名称命名。由于所有这些都是从客户端处理,因此我不必担心存储桶或文件夹的创建。

下面是一个图示:

djangobucket  ------------> bob ---------> picture1.jpg
                                           picture2.jpg
                                           picture3.jpg
                                           picture4.jpg

如您所见,Bob有很多图片。上传用户照片到S3后,我会通过Django通过URL下载它,例如此处的URL是:http://s3.amazonaws.com/djangobucket/bob/picture1.jpg
我下载该图像并进行图像处理,将处理后的图像保存在我的Django应用程序服务器上。
我希望将这个处理过的图像发送回Bob的文件夹中,以便可以在http://s3.amazonaws.com/djangobucket/bob/picture1_processed.jpg 上公开访问。
客户端已经拥有访问Amazon密钥和秘密密钥的权限,因此他们可以将图片上传到此存储桶。服务中的所有用户都使用相同的密钥,我也将使用相同的密钥。
我听说过一种叫做Boto的东西,但它涉及Bucket创建,而我不确定如何仅完成上传部分。 我只关心将图片上传到正确的用户文件夹中。
我已经研究了几个小时,所以现在求助于专家们。
以下是我的代码,以便您更好地理解我的做法。
user = 'bob'

url = 'http://s3.amazonaws.com/djangobucket/bob/picture1.jpg'
filename = url.split('/')[-1].split('.')[0]

download_photo = urllib.urlretrieve(url, "/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))
downloaded_photo = Image.open("/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (filename))

resized_photo = downloaded_photo.resize((300, 300), Image.ANTIALIAS)
new_filename = filename + "_processed"

resized_photo.save("/home/ubuntu/Desktop/Resized_Images/%s.jpg" % (new_filename)) 

我想将位于/home/ubuntu/Desktop/Resized_Images/的已调整大小的照片发送到Amazon S3上djangobucket中Bob的文件夹,并使其公开可见。
谢谢您的帮助。
编辑: 我找到了这个链接:http://www.laurentluce.com/posts/upload-and-download-files-tofrom-amazon-s3-using-pythondjango/ 虽然不完全适用于我的情况,但我认为我正在正确的道路上。
1个回答

18

boto 是实现这一功能的最佳方式。

您可以使用以下方法获取现有的存储桶:

get_bucket(bucket_name, validate=True, headers=None)

安装完 boto 后,这段代码应该可以完成你需要的操作。

from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection('<aws access key>', '<aws secret key>')
bucket = conn.get_bucket('<bucket name>')
k = Key(bucket)
k.key = 'file_path_on_s3' # for example, 'images/bob/resized_image1.png'
k.set_contents_from_file(resized_photo)

这里提供一些链接,分别是Boto APIBoto S3文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接