How to handle uploaded files in webapp2

2019-04-26 05:34发布

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?

3条回答
【Aperson】
2楼-- · 2019-04-26 06:21

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.

查看更多
不美不萌又怎样
3楼-- · 2019-04-26 06:22

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!

查看更多
姐就是有狂的资本
4楼-- · 2019-04-26 06:29

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.

查看更多
登录 后发表回答