0

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でこれを実行します。

  1. 「ファイルを選択」をクリックします
  2. アップロードするファイルを選択してください
  3. 「送信」をクリックします

戻ってくるページには次のように書かれています。

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と同じように動作しました。

4

1 に答える 1

1

フォームenctypeはである必要がありますmultipart/form-data。次のように追加してください(メソッド属性では大文字と小文字は区別されません)。

<form method="POST" enctype="multipart/form-data">

また、blobstoreアップロードの使用を検討してください。サイズ制限がないため、バックエンドとしてGoogle Cloud Storageを使用することもできます。これにより、ACLと共有機能の柔軟性が高まります。

于 2013-03-24T07:50:51.067 に答える