2016-04-24 160 views
0

我遇到以下代码的问题。虽然试图将文件上传到使用POST请求的API我得到一个错误说带请求的HTTP-Post失败:BadStatusLine

File "upload.py", line 44, in <module> 
    so.uploadData("./test.txt") 
    File "upload.py", line 37, in uploadData 
    req = requests.post("http://"+server, data=payload, headers=headers) 
    File "/Library/Python/2.7/site-packages/requests/api.py", line 109, in post 
    return request('post', url, data=data, json=json, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/api.py", line 50, in request 
    response = session.request(method=method, url=url, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/sessions.py", line 468, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/Library/Python/2.7/site-packages/requests/sessions.py", line 576, in send 
    r = adapter.send(request, **kwargs) 
    File "/Library/Python/2.7/site-packages/requests/adapters.py", line 412, in send 
    raise ConnectionError(err, request=request) 
requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",)) 

我的代码看起来是这样的:

filedata= open(path, 'r') 
payload = {'name': self.username, 'file':filedata} 
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36', 'content-type': "multipart/form-data"} 
req = requests.post("http://"+server, data=payload, headers=headers) 

有没有人有这个问题的解决方案?此致敬礼

回答

2

您的代码不构建一个有效的multipart/form-data POST请求 - 它正在构建一个应用程序/ x-www-form-urlencoded。覆盖Content-type标题不会改变数据发布的方式。服务器发现无效请求并丢弃连接,这会导致您在客户端看到的错误。

requests为POST的multipart/form-data的最简单的方法是使用files参数:

with open(path, 'rb') as filedata: 
    payload = {'name': self.username} 
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'} 
    req = requests.post(url, data=payload, headers=headers, files={'file': filedata}) 

这样requests将构造一个有效的multipart/form-data的POST请求。

的另一种方式做到这一点,如果你没有特别要求,该请求使用的multipart/form-data的不重写Content-type头:

with open(path, 'rb') as filedata: 
    payload = {'name': self.username, 'file': filedata} 
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'} 
    req = requests.post(url, data=payload, headers=headers) 
+0

非常感谢你,我之前也试过这种但由于其他错误,它不起作用。 – Julius