2015-04-02 897 views
3

我已经成功地使用了requests模块上传二进制文件(jpg),具有类似如下:问题与aiohttp POST的二进制文件上传

upload_url = 'http:10.1.1.1:8080/api/media/photo' 
headers = {'Authorization': token_string, 'Content-Type': 'image/jpg'} 
data = open('photo.JPG', 'rb') 
params = {'name': 'photo.JPG'} 
r = requests.post(upload_url, params=params, data=data, headers=headers) 

现在试图与aiohttp客户做到这一点。这是我到目前为止:

def upload_photos(token): 
    upload_url = '10.0.1.1:8080/api/media/photo' 
    headers = {'Authorization': token, 'Content-Type': 'image/jpg'} 
    data = {'file': open('photo.JPG', 'rb')} 
    params = {'name': 'photo.JPG'} 
    r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers) 

if __name__ == '__main__':  
    asyncio.get_event_loop().run_until_complete(upload_photos(token)) 

但我得到了400返回,与{"detail": "Specified value is invalid: Invalid Content-Length specified"}
就好像它没有正确发送photo.jpg。 aiohttp文档提到了多部分编码文件和流媒体,但这不是我想要的。

如何在请求中使用类似POST的二进制文件形式,但使用aiohttp?

回答

0

谢谢你的错误报告。至于解决方法我想用块传输编码:

headers['Transfer-Encoding'] = 'chunked' 
r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers, chunked=1024) 

配方应该工作,至少我们在我们的测试套件非常simular代码:https://github.com/KeepSafe/aiohttp/blob/master/tests/test_client_functional.py#L322

我会尝试修复的Content-Length在下一个aiohttp发布中计算你的上传方式。

+0

哇,谢谢@安德鲁。我想过的最后一件事是,我看到的是一个aiohttp错误......我总是首先责备自己,因为不知道我在做什么;-)。 – Gandalf44 2015-04-02 18:31:42

+0

仍然无法做到这一点...这是我的代码片段...我做了其他错误? 'header = {'Authorization':token_string,'Content-Type':'image/jpg','Transfer-Encoding':'chunked'} params = {'name':'photo.JPG'} 打开('photo.JPG','rb')作为f: r2 =从aiohttp.request('post',upload_url,params = params,data = f,chunked = 1024,headers = headers)产生' – Gandalf44 2015-04-02 22:20:53

+0

发送文件内容,而不是文件对象。类似于'data = f.read()'。 – 2015-04-02 23:59:49