Python:使用cherrypy通过POST发送和接收大文件

时间:2012-10-21 22:07:28

标签: python http post upload cherrypy

我有一个樱桃网服务器,需要能够通过http post接收大文件。我现在有一些工作,但是一旦发送的文件太大(大约200mb),它就会失败。我正在使用curl发送测试发布请求,当我尝试发送一个太大的文件时,curl吐出“随请求发送的实体超过了允许的最大字节数”。搜索周围,这似乎是一个错误来自cherrypy。

所以我猜测发送的文件需要以块的形式发送?我用mmap尝试了一些东西,但是我无法理解它。处理文件上载的方法是否也需要能够以块的形式接受数据?

2 个答案:

答案 0 :(得分:4)

我以DirectToDiskFileUpload为起点。它处理大型上传所做的更改是:

  1. server.max_request_body_size0(默认为100MB),
  2. server.socket_timeout60(默认为10秒),
  3. response.timeout3600(默认为300秒),
  4. 使用tempfile.NamedTemporaryFile避免双重复制。
  5. 还有一些无用的操作可以避免在内存中保持上传,这会禁用标准的CherryPy正文处理并手动使用cgi.FieldStorage。它没用,因为有cherrypy._cpreqbody.Part.maxrambytes

      

    Part将存储其数据之后的字节阈值   在文件而不是字符串。默认为1000,就像中的cgi模块一样   Python的标准库。

    我已经尝试了以下代码(由Python 2.7.4,CherryPy 3.6运行)和1.4GB文件。内存使用情况(在 gnome-system-monitor 中)从未达到10MiB。根据实际写入磁盘的字节数,cat /proc/PID/io的{​​{1}}几乎是文件的大小。使用标准write_bytescherrypy._cpreqbody.Part,它显然会加倍。

    shutil.copyfileobj

答案 1 :(得分:0)

大量文件上传总是有问题的。在上传过程中连接关闭后你会怎么做?请改用chunked file upload方法。