[python] PILでリサイズしたファイルデータを保存せずにS3にアップロードする

APPサーバーにアップロードしたファイルデータを保存せずに、メモリ上でリサイズ、そのままS3にアップロードしたい時のメモ。
デプロイサーバーにherokuを使ってるので、ファイル保存ができずに結構はまった

from boto.s3 import connection,key
import PIL.Image
from io import BytesIO

ACCESS_ID = '******'
SECRET_KEY = '*****'
BUCKET_NAME = '******'
conn = connection.S3Connection(ACCESS_ID, SECRET_KEY)
bucket = conn.get_bucket(BUCKET_NAME)
k = key.Key(bucket, 'hoge/test.png')
img = PIL.Image("test.jpg")
img.thumbnail((400,600), Image.ANTIALIAS)
out = BytesIO()
img.save(out, "PNG")
k.set_contents_from_string(out.getvalue(), headers={"Content-Type":"image/png"})

上記の例では、"test.jpg"という画像ファイルをS3のバケットの"hoge/test.png"にアップロードしている。
画像のリサイズだけでなくJPEGからPNGの変換も行っているが、これは別に必須ではないのであしからず。

メモpython,S3

Posted by gm2bv