GAEの「helloworld」サンプルアプリをベースとして使用しますが、「helloworld.py」を次のように変更します。
import webapp2
class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
self.response.write(
"""
<form method="post">
UPLOAD: <input type="file" name="file_param"/>
<br/>
<input type="submit" name="submit_param" value="Submit">
</form>
"""
)
def post(self):
field_storage = self.request.POST["file_param"]
try:
mimetype = field_storage.type
self.response.write("Mimetype: {}".format(mimetype))
except:
self.response.write("No FieldStorage object, field_storage={}".format(field_storage))
app = webapp2.WSGIApplication([('/', MainPage)], debug=True)
MacOSX上のGoogleChromeでこれを実行します。
- 「ファイルを選択」をクリックします
- アップロードするファイルを選択してください
- 「送信」をクリックします
戻ってくるページには次のように書かれています。
No FieldStorage object, field_storage=<the name of the file I uploaded>
http://webapp-improved.appspot.com/guide/request.html#filesおよびさまざまな投稿の例によるself.request.POST[name]
と、cgi.FieldStorageオブジェクトである必要があります。しかし、この例が示すように、self.request.POST[name]
はアップロードされたファイルのファイル名を含む文字列です。それがcgi.FieldStorageオブジェクトである場合、プログラムがアップロードされたファイルのmimetypeを表示することを期待します。
mimetypeと、もちろん値、つまりファイルのコンテンツを取得できるように、cgi.FieldStorageオブジェクトが必要です。私は何が間違っているのですか?
ちなみに、webapp2からwebapp(を使用from google.appengine.ext import webapp
)に切り替えても違いはありません。また、SafariまたはFirefoxで実行すると、Chromeと同じように動作しました。