【问题标题】:python: parse HTTP POST request w/file upload and additional paramspython:使用文件上传和其他参数解析 HTTP POST 请求
【发布时间】:2010-12-05 19:28:43
【问题描述】:

任务很简单:在服务器端(python)接受一个包含上传文件和更多表单参数的 HTTP POST。

我正在尝试实现上传进度指示器,因此我需要能够逐块读取文件内容。

我发现的所有方法都是基于 cgi.FieldStorage,它以某种方式只允许我获取整个文件(在内存中,这本身就是一场灾难)。有人建议重新定义 FieldStorage.make_file 方法(),这似乎破坏了 cgi 实现(奇怪...)。

我目前能够逐块读取整个 wsgi 输入到文件系统,得到以下数据:

-----------------------------9514143097616
Content-Disposition: form-data; name="myfile"; filename="inbound_marketing_cartoon_ebook.pdf"
Content-Type: application/pdf

... 1.5 MB of PDF data

-----------------------------9514143097616
Content-Disposition: form-data; name="tid"

194
-----------------------------9514143097616--

有谁知道是否有任何 Python 库可以可靠地解析这个东西? 还是我应该手动执行此操作? (即 Python 2.5)

谢谢。

【问题讨论】:

    标签: python upload wsgi


    【解决方案1】:

    正如您所建议的,我会(并且以前做过)覆盖FieldStorage 对象的make_file 方法。只需返回一个具有write 方法的对象,该方法既接受数据(进入文件或内存或你有什么)并跟踪你的进度指示器收到了多少。

    这样做,您还可以访问文件的长度(由客户端提供)、文件名和发布文件的密钥。

    为什么这似乎破坏了您的 CGI 实现?

    另一种选择是在浏览器中使用 Flash 上传器进行进度跟踪(想到YUI UploaderSWFUpload)并完全跳过服务器上的跟踪。那么您不必通过一系列 AJAX 请求来获取进度。

    【讨论】:

      【解决方案2】:

      这似乎违反直觉(而且我觉得这个模块的名字很糟糕),但email 可能会做你想做的事。我从未使用过它,但一位同事在电子邮件处理系统中使用过;由于这些消息本质上只是 RFC 2822,email 可能会解析它们。

      The documentation for email 乍一看很透彻。

      我的直觉是,您可能最终会在内存中找到该文件,但您确实对此表示懊恼。

      【讨论】:

        【解决方案3】:

        你可能想看看 Django 做了什么。他们有一个非常好的自定义文件上传处理程序实现,它允许您对它们进行子类化以启用进度条等功能。请参阅the documentationthe relevant code - 即使您不想使用 Django,它也一定会给你有一些想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-18
          • 2021-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-23
          • 2011-04-17
          相关资源
          最近更新 更多