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)

Un article de laurent luce