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