2013-09-10 5 views
5

Я сейчас изменяю размеры изображений на лету, когда пользователь загружает картинку. Исходное изображение хранится на Amazon S3 в ковше под названием djangobucket. Внутри этого ведра содержится тысячи папок.Загрузить изображения в Amazon S3 с помощью Django

Каждая папка названа в честь пользователя. Мне не нужно беспокоиться о создании или создании корзин, поскольку все это обрабатывается с клиентской стороны.

Вот схема:

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

Как вы можете видеть, у Боба есть много фотографий. Когда пользователь загружает картинку в S3, я загружаю ее через Django по URL-адресу, в этом случае это будет: http://s3.amazonaws.com/djangobucket/bob/picture1.jpg

Скачайте изображение и выполните обработку изображения и сохраните обработанное изображение на моем сервере приложений django.

Я хотел бы послать это обработанное изображение обратно в папку Боба, так что он может быть публично достигнут на http://s3.amazonaws.com/djangobucket/bob/picture1_processed.jpg

клиента уже имеет доступ к ключу амазонки и секретному ключу, чтобы он или она может загружать фотографии в это ведро. Все пользователи службы используют одни и те же ключи. Я тоже буду использовать те же ключи.

Я слышал о чем-то, что называется 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)) 

Я хотел бы послать малоформатной фотографии, сохраненные в/дома/Ubuntu/Desktop/Resized_Images/ в папку Боба в djangobucket на Amazon S3 и сделать его общедоступным.

Благодарим за помощь.

EDIT Я нашел эту ссылку: http://www.laurentluce.com/posts/upload-and-download-files-tofrom-amazon-s3-using-pythondjango/

Не совсем, как использовать его для моего дела, но я думаю, что я нахожусь на правильном пути.

ответ

15

boto - лучший способ для этого.

Вы можете получить существующее ведро с помощью:

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

После установки бота, этот код должен делать то, что вам нужно сделать

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 API и Boto S3 Doc

+0

спасибо, это сработало как шарм. – noahandthewhale

Смежные вопросы