在 cherrypy 中以 multipart post 读取的文件始终为空
File read in multipart post in cherrypy is always empty
我无法读取作为多部分 POST 请求的一部分发送到 cherrypy 服务器的文件内容。我正在使用 Python 'requests' 模块来创建请求。尽管长度报告为非零,但在 cherrypy 中解析时发送的文件内容始终为空。
Python 服务器版本:3.6.8
cherrypy 版本:18.6.0
请求版本:2.18.4
请求通过
response = requests.post(<url>, files={'file': open('slask.txt', 'rb')}, data={'name': 'some_name'}, verify=False)
其中 <url>
是对服务器的验证 url。
slask.txt
是读通 open('slask.txt', 'rb').read()
时读到 b'slask \r\n'
的文件
cherrypy 服务器的代码:
import os
import io
import cherrypy
cherrypy.server.socket_host = '<url>'
class ServerExample():
@cherrypy.expose
def index(self):
return "Cherrypy server to manage something ..."
@cherrypy.expose
def upload(self, *args, **kwargs):
image = cherrypy.request.params['file']
print(image.filename)
print(image.fp.fp.rfile)
print(image.fp.fp.remaining)
print(image.fp.length)
print(image.read())
print(cherrypy.request.params['name'])
return "parsed file..."
cherrypy.quickstart(ServerExample())
服务器的响应是200 "parsed file..."
。
服务器的输出是:
Image filename: slask.txt
Underlying data object: <cheroot.makefile.StreamReader name=5>
Value of field 'remaining' in underlying data object: 0
Image length: 247
Image content: b''
Contents of multipart data field 'name': some name
<obfuscated> - - [27/Feb/2021:10:20:50] "POST /upload HTTP/1.1" 200 15 "" "python-requests/2.18.4"
可以看出请求的字段已经到位。然而,Part
对象的 read()
方法产生了一个空结果,尽管它的 length
是 247
。奇怪的是底层数据对象有 remaining
字节 0
尽管没有读取任何字节。
请求本身已通过向 http://ptsv2.com 发出完全相同的请求进行了独立验证,可以证明它包含所有预期信息。
我应该如何读出变量 image
的文件内容?
正如问题评论中指出的那样,访问与上传部分关联的二进制数据的方法是通过 cherrypy.request.params['key'].file.read()
。
我无法读取作为多部分 POST 请求的一部分发送到 cherrypy 服务器的文件内容。我正在使用 Python 'requests' 模块来创建请求。尽管长度报告为非零,但在 cherrypy 中解析时发送的文件内容始终为空。
Python 服务器版本:3.6.8
cherrypy 版本:18.6.0
请求版本:2.18.4
请求通过
response = requests.post(<url>, files={'file': open('slask.txt', 'rb')}, data={'name': 'some_name'}, verify=False)
其中 <url>
是对服务器的验证 url。
slask.txt
是读通 open('slask.txt', 'rb').read()
b'slask \r\n'
的文件
cherrypy 服务器的代码:
import os
import io
import cherrypy
cherrypy.server.socket_host = '<url>'
class ServerExample():
@cherrypy.expose
def index(self):
return "Cherrypy server to manage something ..."
@cherrypy.expose
def upload(self, *args, **kwargs):
image = cherrypy.request.params['file']
print(image.filename)
print(image.fp.fp.rfile)
print(image.fp.fp.remaining)
print(image.fp.length)
print(image.read())
print(cherrypy.request.params['name'])
return "parsed file..."
cherrypy.quickstart(ServerExample())
服务器的响应是200 "parsed file..."
。
服务器的输出是:
Image filename: slask.txt
Underlying data object: <cheroot.makefile.StreamReader name=5>
Value of field 'remaining' in underlying data object: 0
Image length: 247
Image content: b''
Contents of multipart data field 'name': some name
<obfuscated> - - [27/Feb/2021:10:20:50] "POST /upload HTTP/1.1" 200 15 "" "python-requests/2.18.4"
可以看出请求的字段已经到位。然而,Part
对象的 read()
方法产生了一个空结果,尽管它的 length
是 247
。奇怪的是底层数据对象有 remaining
字节 0
尽管没有读取任何字节。
请求本身已通过向 http://ptsv2.com 发出完全相同的请求进行了独立验证,可以证明它包含所有预期信息。
我应该如何读出变量 image
的文件内容?
正如问题评论中指出的那样,访问与上传部分关联的二进制数据的方法是通过 cherrypy.request.params['key'].file.read()
。