2012-11-27 16 views
7

Google App Engineのwebapp2は非常に暗黙のうちにdocumentation regarding the handling of uploaded filesです。webapp2でアップロードされたファイルを処理する方法

Uploaded files are available as cgi.FieldStorage (see the cgi module) instances directly in request.POST. 

私は、NDB.JsonPropertyに保存するJSONファイルのPOSTリクエストを作成するフォームを持っています。

リクエストオブジェクトからファイルを読み取る方法の簡単な例はありますか?

+0

POSTは 'application/x-www-form-urlencoded'または' multipart/form-data'としてエンコードされていますか? –

+0

同様の質問:http://stackoverflow.com/questions/6846333/how-does-cgi-fieldstorage-store-files –

+0

Martijn:私はmultipart/form-dataを使用していますが、他のタイプを使用していますか? – fccoelho

答えて

0

代わりHow does cgi.FieldStorage store files?に記載の溶液を使用する、私は経由でファイルにアクセスした後のハンドラメソッド形でENCTYPE =「multipart/form-data」を使用し、

file_content = self.request.POST.multi['myfieldname'].file.read() 

それは働いた!

+0

私はJsonPropertyの値をモデルで圧縮して定義しなければなりませんでした。そうでないと、putが大きすぎるというエラーが発生します。 – fccoelho

7

あなたの形式でenctype="multipart/form-data"を使用して、あなたのハンドラで使用してファイルの内容を取得することができます。

raw_file = self.request.get('field_name') 

すると、お使いのモデルのプロパティへの入力としてraw_file渡します。

+0

これは私のために働いて、ファイル全体を返します。 –

4

Googleの文書はちょうど吸う。私はwebapp2のリクエストオブジェクトを試して約2時間を費やし、最後にこれを行う方法を見つけました。

チェックhttps://stackoverflow.com/a/30969728/2310396

基本的なコードスニペットはここにある:あなただけself.request.POST.get('attachments')を使用するので、もし彼らは、同じ名前を持つHTMLフォームで複数のinputフィールドかもしれないので

class UploadHandler(BaseHandler): 
    def post(self): 
     attachments = self.request.POST.getall('attachments') 

     _attachments = [{'content': f.file.read(), 
         'filename': f.filename} for f in attachments] 

我々は、self.request.POST.getall('attachments')代わりのself.request.POST.get('attachments')を使用し、あなた'LLそのうちの1つだけを取得します。

+1

この解決策では、フォームに 'attachments'というフォームフィールドがあることを前提としています。これは魔法のwebapp2のキーワードではありません。 – Sam

関連する問題