octobre
2010
Cet article explique comment uploader des fichiers vers Amazon S3 en utilisant Python/Django et comme downloader des fichiers à partir de S3 vers votre PC.
On démarre avec un fichier dans /var/www/data posté par un utilisateur via un formulaire.
Sur Gourmious, j’ai besoin d’utiliser plusieurs versions de la même photo: petite taille, version pour téléphones portables etc… Pour celà, je génère 4 photos de taille différente avec un script bash à partir de mon appli Django quand je reçois la photo. Je passe l’identifiant de la photo comme paramètre: ‘id’.
p = subprocess.Popen(["/bin/bash", "/usr/bin/resize.x", id], stdout = subprocess.PIPE) p.stdout.read()
resize.x contient le code suivant:
#!/bin/bash filename=$1 convert -resize "500x500" /var/www/data/$filename.png /var/www/data/$filename"_s.png" convert -resize "300x300" /var/www/data/$filename.png /var/www/data/$filename"_m.png" convert -resize "75x75" /var/www/data/$filename.png /var/www/data/$filename"_t.png" convert -resize "48x48" /var/www/data/$filename.png /var/www/data/$filename"_e.png"
On a donc nos 5 fichiers (originale + 4 versions de taille différente) à uploader vers Amazon S3.
On a besoin de créer un bucket qui va contenir nos fichiers. Celà peut-être fait à partir de la console de configuration sur Amazon.
Pour la suite, on va utiliser la librairie python boto qui va nous faciliter la tâche.
On a besoin de définir les variables suivantes dans settings.py dans notre projet Django.
BUCKET_NAME = 'bucket_name' AWS_ACCESS_KEY_ID = ... AWS_SECRET_ACCESS_KEY = ...
Upload vers S3
Voici le code pour uploader nos photos (plus les versions de taille différente):
def push_picture_to_s3(id): try: import boto from boto.s3.key import Key # demande à boto de n'imprimer que les messages critical logging.getLogger('boto').setLevel(logging.CRITICAL) bucket_name = settings.BUCKET_NAME # on se connecte au bucket conn = boto.connect_s3(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY) bucket = conn.get_bucket(bucket_name) # on s'occupe des 5 fichiers: original + 4 versions de taille différente suffixes = ['', '_e', '_m', '_s', '_t'] for s in suffixes: key = 'dish_%s%s.png' % (id, s) fn = '/var/www/data/%s%s%s' % (id, s, ext) # on crée une clé pour ce fichier k = Key(bucket) k.key = key k.set_contents_from_filename(fn) # on indique ce fichier comme étant public pour pouvoir y accéder # en utilisant un lien comme http://s3.amazonaws.com/bucket_name/key k.make_public() # on efface le fichier localement os.remove(fn) except: ...
Download à partir de S3
Comme on l’a vu, on peut accéder au fichier sur Amazon S3 en utilisant le lien: http://s3.amazonaws.com/bucket_name/key. On peut également y accéder en utilisant la librairie boto pour downloader les fichiers. J’utilise cette méthode pour créer une copie journalière sur mon PC.
Voici le script Python pour faire cela:
import boto import sys, os from boto.s3.key import Key LOCAL_PATH = '/backup/s3/' AWS_ACCESS_KEY_ID = '...' AWS_SECRET_ACCESS_KEY = '...' bucket_name = 'bucket_name' # on se connecte au bucket conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) bucket = conn.get_bucket(bucket_name) # on parcoure la liste des fichiers bucket_list = bucket.list() for l in bucket_list: keyString = str(l.key) # on vérifie si le fichier existe localement, si non, on le télécharge if not os.path.exists(LOCAL_PATH+keyString): l.get_contents_to_filename(LOCAL_PATH+keyString)