仅在启用SSL时才会出现下一个问题!
我使用https运行带有版本0.12.6和cherrypy版本3.2.2的服务器。
客户端代码将文件发送到服务器,服务器将其保存。
当我发送大小低于102199字节的文件时,它会被接收并成功保存。但是,当我发送大小或等于102199的文件时,我得到例外:
服务器代码:
from bottle import request, response,static_file, run,server_names
来自OpenSSL import crypto,SSL 从瓶子导入瓶子,运行,请求,server_names,ServerAdapter
app = Bottle()
app.mount('/test' , app)
class MySSLCherryPy(ServerAdapter):
def run(self, handler):
from cherrypy import wsgiserver
server = wsgiserver.CherryPyWSGIServer((self.host, self.port), handler)
server.ssl_certificate = "./cert"
server.ssl_private_key = "./key"
try:
server.start()
finally:
server.stop()
@app.post('/upload')
def received_file():
file = request.files.file
# file.save("./newfile")
file_path="./newfile"
with open(file_path, 'w') as open_file:
open_file.write(file.read())
if __name__=='__main__':
server_names['mysslcherrypy'] = MySSLCherryPy
run(app, host='0.0.0.0', port=4430, server='mysslcherrypy')
exit(0)
为什么服务器无法获取超过给定限制的文件?我需要改变吗? (我试图在函数received_file中设置常量MEMFILE_MAX,但它没有帮助) 如果服务器是http而不是https,问题就会消失!
纯文本中的异常(如果您无法查看图像):
追踪(最近一次通话): 文件“/usr/lib/python2.6/site-packages/bottle.py”,第861行,在_handle return route.call(** args) 文件“/usr/lib/python2.6/site-packages/bottle.py”,第1727行,在包装器中 rv =回调(* a,** ka) 在received_file中文件“testser”,第28行 file = request.files.file 文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取 如果key不在存储中:storage [key] = self.getter(obj) 文件“/usr/lib/python2.6/site-packages/bottle.py”,第1106行,在文件中 对于名称,self.POST.allitems()中的项目: 文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取 如果key不在存储中:storage [key] = self.getter(obj) POST中的文件“/usr/lib/python2.6/site-packages/bottle.py”,第1222行 args = dict(fp = self.body,environ = safe_env,keep_blank_values = True) 文件“/usr/lib/python2.6/site-packages/bottle.py”,第1193行,正文 self._body.seek(0) 文件“/usr/lib/python2.6/site-packages/bottle.py”,第165行,获取 如果key不在存储中:storage [key] = self.getter(obj) 在_body中的文件“/usr/lib/python2.6/site-packages/bottle.py”,第1162行 对于body_iter中的部分(read_func,self.MEMFILE_MAX): 文件“/usr/lib/python2.6/site-packages/bottle.py”,第1125行,在_iter_body中 part = read(min(maxread,bufsize)) 文件“/usr/lib/python2.6/site-packages/cherrypy/wsgiserver/wsgiserver2.py”,第329行,正在阅读 data = self.rfile.read(size) 文件“/usr/lib/python2.6/site-packages/cherrypy/wsgiserver/wsgiserver2.py”,第1052行,正在阅读 断言n< = left,“recv(%d)返回%d字节”%(left,n) AssertionError:recv(47)返回48个字节
解决方案
在文件bottle.py中,我将.MEMFILE_MAX的值更改为10000000,由此解决了问题。最好的方法是从服务器代码添加下一行:
bottle.BaseRequest.MEMFILE_MAX=30000000000