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)

在 Mac OSX 上的 Google Chrome 中运行:

  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。

我需要 cgi.FieldStorage 对象,这样我才能获得 mimetype,当然还有值,即文件的内容。我究竟做错了什么?

顺便说一句,从 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 回答