我在使用bottle.py从服务器端处理分块上传时遇到了一些麻烦。我正在使用python请求和request-toolbelt来进行HTTP和上传进度跟踪。我打算使用该脚本上传大文件,因此需要进行分块上传并避免读取内存中的文件。 我略微调整了requests-toolbelt文档中显示的示例,虽然我可以看到上传进度数据,但我在服务器端获得了0大小的文件。这是我正在使用的代码。
#uploader.py
def create_callback(encoder):
encoder_length = len(encoder)
prog_bar = Bar(expected_size=encoder_length, filled_char='=')
def callback(monitor):
prog_bar.show(monitor.bytes_read)
return callback
if __name__ == "__main__":
m = MultipartEncoder(
fields={'testfile': ('test.txt', open('test.txt', 'rb'), 'text/plain')}
)
callback = create_callback(m)
m = MultipartEncoderMonitor(m, callback)
r = requests.post('http://127.0.0.1/upload', data=m,
headers={'Content-Type': m.content_type})
print r.status_code #prints 200
#server.py
@post("/upload")
def handle_upload():
print len(request.POST['testfile'].file.read()) #i always get zero
if __name__ == "__main__":
run(server='cherrypy', port="8080") # I still get zero even without the cherrypy server
我想我已按照说明操作了,但我无法弄清楚我在哪里错过了这一点。
[编辑]
我已查看this post,其中介绍了如何修补文件 并依赖于标题中的Content-Range字段,但是当我打印出请求标题时,我只能看到内容长度