【问题标题】:How to handle uploaded files in webapp2如何在 webapp2 中处理上传的文件
【发布时间】:2012-11-15 03:00:23
【问题描述】:

Google appengine 的 webapp2 有一个非常神秘的documentation regarding the handling of uploaded files

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

我有一个表单,它发出我想要存储在 NDB.JsonProperty 中的 JSON 文件的 POST 请求。

谁能提供一个简短的例子来说明如何从请求对象中读取文件?

【问题讨论】:

  • POST 编码为application/x-www-form-urlencoded 还是multipart/form-data
  • Martijn:我正在使用 multipart/form-data,我应该使用其他类型吗?
  • Paul:问题 6846333 没有解决我的问题,我仍然遇到一个神秘的异常:“lower”。我希望有一个 appengine 的调试工具栏...
  • 调试工具叫SDK或者你用Eclipse pydev、chrome工具……你可以把SDK连接到外界。

标签: python google-app-engine webapp2


【解决方案1】:

您可以在表单中使用enctype="multipart/form-data",然后通过在您的处理程序中使用来获取文件内容:

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

然后,将 raw_file 作为输入传递给模型的属性。

【讨论】:

    【解决方案2】:

    Google 的文档很烂。我花了大约两个小时试验 webapp2 的请求对象,终于找到了一种方法。

    检查https://stackoverflow.com/a/30969728/2310396

    基本代码sn-ps在这里:

    class UploadHandler(BaseHandler):
        def post(self):
            attachments = self.request.POST.getall('attachments')
    
            _attachments = [{'content': f.file.read(),
                             'filename': f.filename} for f in attachments]
    

    我们使用self.request.POST.getall('attachments')而不是self.request.POST.get('attachments'),因为它们可能是HTML表单中同名的多个input字段,所以如果你只使用self.request.POST.get('attachments'),你只会得到其中一个。

    【讨论】:

    • 请注意,此解决方案假定您的表单中有一个名为 attachments 的表单字段。这不是一个神奇的 webapp2 关键字或任何东西。
    【解决方案3】:

    我没有使用How does cgi.FieldStorage store files?中描述的解决方案,而是在表单中使用了enctype="multipart/form-data",并且

    在帖子的处理程序方法中,我通过以下方式访问了文件:

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

    成功了!

    【讨论】:

    • 我必须在模型中将 JsonProperty 值定义为压缩的,否则我会收到 put 太大的错误...
    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 2012-01-18
    • 2017-06-24
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2016-01-10
    相关资源
    最近更新 更多