Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Tornado HTTPRequest发布原始文件_Http_Asynchronous_Tornado - Fatal编程技术网

如何使用Tornado HTTPRequest发布原始文件

如何使用Tornado HTTPRequest发布原始文件,http,asynchronous,tornado,Http,Asynchronous,Tornado,我想使用Tornado(AsyncHTTPClient)在POST请求中发送一些数据 其中self.request.body是一个原始二进制文件(图像) 我尝试这样做: http_client = AsyncHTTPClient() rec_body = {'source': self.request.body, 'top': str(self.config["top"]), 'model': self.config["model"]} request = HTTPRequest( url =

我想使用Tornado(AsyncHTTPClient)在POST请求中发送一些数据

其中
self.request.body
是一个原始二进制文件(图像)

我尝试这样做:

http_client = AsyncHTTPClient()
rec_body = {'source': self.request.body, 'top': str(self.config["top"]), 'model': self.config["model"]}
request = HTTPRequest( url = os.path.join(self.config["dest_addr"], self.config["sub_sect"]) , method='POST', body =rec_body)
result =  http_client.fetch( request, callback=self.handle_request)
但我犯了这个错误

  File "/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py", line 424, in __init__
    self.body = body
  File "/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py", line 468, in body
    self._body = utf8(value)
  File "/usr/local/lib/python2.7/dist-packages/tornado/escape.py", line 203, in utf8
    "Expected bytes, unicode, or None; got %r" % type(value)
TypeError: Expected bytes, unicode, or None; got <type 'dict'>
ERROR:tornado.access:500 POST /upload (192.168.72.84) 13.14ms
文件“/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py”,第424行,在__
self.body=身体
正文第468行的文件“/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py”
自身。\主体=utf8(值)
文件“/usr/local/lib/python2.7/dist-packages/tornado/escape.py”,第203行,utf8格式
应为字节、unicode或无;获取了%r”%type(值)
TypeError:应为字节、unicode或无;得到了
错误:tornado。访问:500 POST/上传(192.168.72.84)13.14ms
我做错了什么?

我尝试了curl(天真),请求模块都可以正常工作,但不是异步的。对于tornado的AsyncHTTPClient来说,这是一个很好的选择

代码如下:

导入模拟类型
从tornado.gen导入协同程序,返回
从tornado.httpclient导入HTTPRequest
从tornado_flickrapi.httpclient导入获取
@协同程序
def姿势(url、字段、文件):
尝试:
response=产生post\u多部分(url、字段、文件)
例外情况除外,如e:
提高e
提高返回(响应)
@协同程序
def post_多部分(url、字段、文件):
"""
将字段和文件作为多部分/表单数据发布到http主机。
字段是常规表单字段的(名称、值)元素序列。
文件是一系列(名称、文件名、值)元素,用于存储数据
作为文件上传。
返回服务器的响应页面。
"""
内容类型,正文=编码多部分格式数据(字段、文件)
标题={“内容类型”:内容类型,“内容长度”:str(len(body))}
request=HTTPRequest(url,“POST”,headers=headers,body=body,validate\u cert=False)
尝试:
response=获取(请求)
例外情况除外,如e:
提高e
提高返回(响应)
def encode_multipart_formdata(字段、文件):
"""
字段是常规表单字段的(名称、值)元素序列。
文件是一系列(名称、文件名、值)元素,用于存储数据
作为文件上传。
为httplib.HTTP实例返回(content_type,body)
"""
BOUNDARY='------------此_是_边界u$'
CRLF='\r\n'
L=[]
对于字段中的(键、值):
L.append('--'+边界)
L.append('Content-Disposition:formdata;name=“%s”'%key)
L.附加(“”)
L.append(值)
对于文件中的(键、文件名、值):
filename=filename.encode(“utf8”)
L.append('--'+边界)
附加(
'内容处置:表单数据;name=“%s”;filename=“%s”'%(
键,文件名
)
)
L.append('内容类型:%s'%get\u内容类型(文件名))
L.附加(“”)
L.append(值)
L.append('--'+BOUNDARY+'--'))
L.附加(“”)
主体=CRLF.连接(L)
内容类型='多部分/表单数据;边界=%s“%s”边界
返回内容类型,正文
def get_内容_类型(文件名):
返回mimetypes.guess_类型(文件名)[0]或“应用程序/八位字节流”
  File "/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py", line 424, in __init__
    self.body = body
  File "/usr/local/lib/python2.7/dist-packages/tornado/httpclient.py", line 468, in body
    self._body = utf8(value)
  File "/usr/local/lib/python2.7/dist-packages/tornado/escape.py", line 203, in utf8
    "Expected bytes, unicode, or None; got %r" % type(value)
TypeError: Expected bytes, unicode, or None; got <type 'dict'>
ERROR:tornado.access:500 POST /upload (192.168.72.84) 13.14ms
Deals with multipart POST requests.
The code is adapted from the recipe found at :
http://code.activestate.com/recipes/146306/
No author name was given.
Author : Alexis Mignon (c)
email  : alexis.mignon@gmail.Com
Date   : 06/08/2011