GoogleAppEngine用フレームワーク Kay で画像ファイルをアップロードする

Google App Engine用フレームワークKayを使い、画像ファイルをアップロードする方法。

画像を保存するためのモデルを用意します。
アップロードされた画像を保存するためのBlobPropertyを用意します。

class ThumbnailImage(db.Model):
    thumbnail = db.BlobProperty()

アップロードのためのフォームを作成します。
ファイルをアップロードするにはFileFieldを使用します。

class UploadForm(forms.Form):
    upload_file = forms.FileField(u'画像ファイル', required=True)

フォームのvalidate()では、引数にrequest.formに加えて、request.filesを指定します。
(参考:11.7. ファイルアップロード — Kay v0.10.0 documentation)

if request.method == 'POST' and form.validate(request.form, request.files):

Images Python APIを使用して、画像を編集します。

uploaded_image = images.Image(form['upload_file'])
uploaded_image.resize(width=100) #幅
thumbnail = uploaded_image.execute_transforms(output_encoding=images.JPEG)

画像データを保存します。

image = ThumbnailImage(thumbnail=thumbnail)
image.put()

保存した画像を表示します。

return Response(image.thumbnail, mimetype='image/jpg')

全体のコードは次のようになります。

myapp/views.py

from google.appengine.ext import db
from google.appengine.api import images
from kay.utils import (forms, render_to_response)
from werkzeug import Response

class ThumbnailImage(db.Model):
    thumbnail = db.BlobProperty()

class UploadForm(forms.Form):
    upload_file = forms.FileField(u'画像ファイル', required=True)

def index(request):
    form = UploadForm()
    if request.method == 'POST' and form.validate(request.form, request.files):
        #画像をリサイズして保存
        uploaded_image = images.Image(form['upload_file'])
        uploaded_image.resize(width=100) #幅
        thumbnail = uploaded_image.execute_transforms(output_encoding=images.JPEG)
        image = ThumbnailImage(thumbnail=thumbnail)
        image.put()
        #保存した画像を表示
        return Response(image.thumbnail, mimetype='image/jpg')

    return render_to_response("myapp/index.html", 
                              {'form': form.as_widget()})

myapp/templates/index.html

{{ form() | safe }}

補足
blobstoreを使う方法は「Kay でも blobstore を使う (サムネイルも)」が参考になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください