【问题标题】:For <input type="file" ...> self.request.POST[name] is just a string对于 <input type="file" ...> self.request.POST[name] 只是一个字符串
【发布时间】:2013-03-24 23:09:13
【问题描述】:

使用 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 中相同。

【问题讨论】:

    标签: google-app-engine webapp2


    【解决方案1】:

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

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

    另外,请考虑使用blobstore upload,因为它没有大小限制,你也可以use Google Cloud Storage as a backend,这将给你更多的ACL和共享能力的灵活性。

    【讨论】:

    • 谢谢!我的示例适用于该更改。 Q1。您在大写 POST 时的想法是什么,因为它适用于小写字母? Q2。为什么优先使用 Blobstore 而不是数据存储 BlobProperty(我从文档中不清楚)?
    猜你喜欢
    • 2013-01-29
    • 2022-11-09
    • 1970-01-01
    • 2016-05-23
    • 2017-12-04
    • 2017-11-26
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多