2017-04-19 67 views
0

我在Python中使用requests來通過POST發送文件。 我的代碼如下所示:通過POST發送文件而無需在Python中進行內容處理

headers = {'Content-Type': 'application/x-tar',       
      'Content-Length': tar_size} 

r = requests.post(server,        
        files={"file": (tar_name, open(tar_name, 'rb'))},   
        headers=headers) 

在從另一個客戶端(C語言編寫)的文件在同一臺服務器都發送相同的方式。當body_file(的WebOb的東西在這裏看到http://docs.webob.org/en/stable/api/request.html)被讀取,從C客戶端讀取文件,但是從我在Python客戶真正的文件prepened有:

--2a95cc93056b45e0b7c3447234788e29 
Content-Disposition: form-data; name="file"; filename="filename.tar" 

是否有某種方式來阻止我的客戶發送這些東西?或者某種方式如何修復服務器,以便它可以從C客戶端和我的客戶端讀取(儘管看起來我們發送了一些不同的消息)

+0

你的意思是你想發送的只是字節,沒有別的? HTTP頭怎麼樣? – Bemmu

+0

在我看來,多部分/表單數據編碼確實需要「Content-Disposition」東西,因此C實現是不正確的,還是定義了自定義客戶端和服務器之間的不同協議?更有用的信息在這裏:http://stackoverflow.com/questions/8659808/how-does-http-file-upload-work – Bemmu

回答

0

好吧,我能解決這個問題。如果有人遇到同樣的問題,我會在這裏發佈我的解決方案。

的解決方案是使用準備請求http://docs.python-requests.org/en/master/user/advanced/#prepared-requests) 然後,我可以把數據放到身體在我所需要的形式。我的代碼現在看起來像這樣:

headers = {'Content-Type': 'application/x-tar',       
      'Content-Size': tar_size} 

req = requests.Request('POST', 
         server, 
         headers)  

prepped = req.prepare() 
with open(tar_name, 'rb') as f: 
    prepped.body = fl.read(tar_size) 

s = Request.Session() 
r = s.send(prepped, 
      stream=True)        
相關問題