我有一个樱桃网服务器,需要能够通过http post接收大文件。我现在有一些工作,但是一旦发送的文件太大(大约200mb),它就会失败。我正在使用curl发送测试发布请求,当我尝试发送一个太大的文件时,curl吐出“随请求发送的实体超过了允许的最大字节数”。搜索周围,这似乎是一个错误来自cherrypy。
所以我猜测发送的文件需要以块的形式发送?我用mmap尝试了一些东西,但是我无法理解它。处理文件上载的方法是否也需要能够以块的形式接受数据?
答案 0 :(得分:4)
我以DirectToDiskFileUpload
为起点。它处理大型上传所做的更改是:
server.max_request_body_size
至0
(默认为100MB),server.socket_timeout
至60
(默认为10秒),response.timeout
至3600
(默认为300秒),tempfile.NamedTemporaryFile
避免双重复制。还有一些无用的操作可以避免在内存中保持上传,这会禁用标准的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_bytes
和cherrypy._cpreqbody.Part
,它显然会加倍。
shutil.copyfileobj
答案 1 :(得分:0)
大量文件上传总是有问题的。在上传过程中连接关闭后你会怎么做?请改用chunked file upload方法。