对于<input type =“file”... =“”/> self.request.POST [name]只是一个字符串

时间:2013-03-24 05:41:41

标签: google-app-engine webapp2

使用GAE&#34; helloworld&#34;示例应用程序作为基础,但更改&#34; helloworld.py&#34;到:

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)

在Mac OSX上的Google Chrome中运行:

  1. 点击&#34;选择文件&#34;
  2. 选择要上传的文件
  3. 点击&#34;提交&#34;
  4. 回来的页面说:

    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。

    我需要cgi.FieldStorage对象,所以我可以获取mimetype,当然还有值,即文件的内容。我做错了什么?

    顺便说一下,从webapp2切换到webapp(使用from google.appengine.ext import webapp)没有任何区别。此外,在Safari或Firefox中运行它,其行为与Chrome中的相同。

1 个答案:

答案 0 :(得分:1)

表单enctype必须为multipart/form-data。请按如下方式添加(方法属性不区分大小写):

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

此外,请考虑使用blobstore upload,因为它没有大小限制,您还可以use Google Cloud Storage as a backend,这将为您提供更多ACL和共享功能的灵活性。