2011年06月07日

GAE/Pでファイルアップロード。

前回、GAE for Pythonでのリクエストデータの受け取り方を紹介したが、今回はファイルアップロードの方法も紹介しようと思う。

先ずは画面HTMLからだ。

index.html
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/">
<input type="file" name="file" />
<input type="submit" value="アップロード" />
</form>

<p>結果</p>
<p>ファイル名: {{ filename }}</p>
<p>ファイルサイズ(byte): {{ filesize }}</p>
<p>MIMEタイプ: {{ mimetype }}</p>
</body>
</html>


そして、お馴染みの helloworld.py を以下のようにする。

helloworld.py
# -*- coding: utf-8 -*-
import cgi
import os

from google.appengine.ext import webapp, db
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
import logging

#
# メインハンドラ
#
class MainHandler(webapp.RequestHandler):
def get(self):
template_values = {}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

def post(self):
file = self.request.get("file")

if file:
# ファイルサイズ取得
blob = db.Blob(file)
filesize = len(blob)

# ファイル名、MIMEタイプ取得
body_file = self.request.body_file.vars['file']
filename = body_file.filename
mimetype = body_file.headers['content-type']

# 実際はここでデータストアへ格納したりする。。。

template_values = {
"filename" : filename,
"filesize" : filesize,
"mimetype" : mimetype
}
else:
template_values = {}

path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()


ポイントは、二つある。

一つ目は、ファイルサイズを取得するところだ。
self.request.get("file") で取ってきた file を db.Blob 型にキャストし、len() でサイズを取得する。
file = self.request.get("file")
blob = db.Blob(file)
filesize = len(blob)


二つ目のポイントは、ファイル名とMIMEタイプを取得するところだ。
self.request.body_file.vars['file'] で取得した body_file の filename プロパティからファイル名が、headers['content-type'] でMIMEタイプがそれぞれ取得できる。
body_file = self.request.body_file.vars['file']
filename = body_file.filename
mimetype = body_file.headers['content-type']




ここはひとつポチっとよろしく。
人気ブログランキングへ

プログラミング Google App Engine
Dan Sanderson
オライリージャパン
売り上げランキング: 40082



posted by 寄り道退屈男 at 09:50 | Comment(0) | TrackBack(0) | GAE for Python
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/45775172
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック