9

Google appengine's webapp2 has a very cryptic documentation regarding the handling of uploaded files.

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

I have a form which makes a POST request of JSON files which I want to store in an NDB.JsonProperty.

Can anyone offer a short example of how do I read the file from the request object?

Sam
  • 5,997
  • 5
  • 46
  • 66
fccoelho
  • 6,012
  • 10
  • 55
  • 67

3 Answers3

9

You can use enctype="multipart/form-data" in your form, and then get file content by using in your handler:

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

Then, pass raw_file as input to your model's property.

Thanos Makris
  • 3,115
  • 2
  • 17
  • 26
5

Google's document just sucks. I've spent about two hours experimenting with webapp2's request object and finally figures out a way to do this.

Check https://stackoverflow.com/a/30969728/2310396.

The basic code snippets is here:

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

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

We use self.request.POST.getall('attachments') instead of self.request.POST.get('attachments'), since they may be multiple input field in HTML forms with the same name, so if you just use self.request.POST.get('attachments'), you'll only get one of them.

Community
  • 1
  • 1
Xiao Hanyu
  • 1,402
  • 16
  • 11
  • 3
    Note that this solution assumes that you have a form field called `attachments` in your form. It's not a magic webapp2 keyword or anything. – Sam Jul 15 '16 at 14:23
0

Instead of using the solution described in How does cgi.FieldStorage store files?, I used enctype="multipart/form-data" in the form, and

in the handler method for the post I accessed the files via:

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

it worked!

Community
  • 1
  • 1
fccoelho
  • 6,012
  • 10
  • 55
  • 67
  • I had to define the JsonProperty values as compressed in the Model, otherwise I would get an error of put being too large... – fccoelho Nov 27 '12 at 17:26