5

任务很简单:在服务器端(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)

谢谢。

4

3 回答 3

2

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

通过这种方式,您还可以访问文件的长度(由客户端提供)、文件名和发布它的密钥。

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

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

于 2009-10-11T20:01:45.120 回答
1

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

email乍一看,文档非常详尽。

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

于 2009-10-11T19:55:56.663 回答
0

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

于 2009-10-11T20:48:41.767 回答