2013-08-29 34 views
4

我想將文件上傳到網址。我想要上傳的文件不在我的計算機上,但是我有該文件的網址。我想要使​​用請求庫來上傳它。所以,我想要做這樣的事情:使用請求庫從url上傳Python文件

url = 'http://httpbin.org/post' 
files = {'file': open('report.xls', 'rb')} 
r = requests.post(url, files=files) 

但唯一不同的是,文件report.xls來自一些不在我的電腦中的網址。

+3

下載它第一次? –

+1

這似乎不是一個好的解決方案。可以? – Rishi

+3

你還打算怎麼做?接受文件的表單需要您將文件的數據發送到「POST」主體,這意味着您必須獲取URL的數據才能發送它。 (當然有人可以編寫一個表單,它會爲你提供一個URL並將其提供給你,但這與接受文件的請求不同)。 – abarnert

回答

8

要做到這一點的唯一方法是下載URL的主體,以便上傳它。

問題是需要file的表單需要HTTP POST中文件的主體。有人可能會寫一個表單,而不是採取一個URL,並自己執行提取...但這將是一個不同的形式和請求比一個文件(或者,也許,相同的形式,與一個可選文件和一個可選的URL)。

當然,您無需將其下載到並將其保存到文件。你可以下載到內存:

urlsrc = 'http://example.com/source' 
rsrc = requests.get(urlsrc) 
urldst = 'http://example.com/dest' 
rdst = requests.post(urldst, files={'file': rsrc.content}) 

當然,在某些情況下,你可能總是要沿着文件名,或者一些其他的頭向前,像Content-Type。或者,對於大文件,您可能希望從一臺服務器流到另一臺服務器而無需下載,然後立即上傳整個文件。你必須手工做任何這樣的事情,但幾乎所有的東西很容易與requests,並在文檔很好地解釋。*


*嗯,這最後一個例子是不太容易...有你以獲取原始套接字包裝請求和readwrite,並確保您沒有死鎖,依此類推...

3

在可能適合您的文檔中有an example。類文件對象可以用作POST請求的流輸入。將此與a stream response組合爲您的GET(通過stream=True)或其他選項documented here之一。

這使您可以從另一個GET執行POST,而無需在本地緩衝整個有效負載。在最糟糕的情況下,您可能必須編寫一個類似文件的類作爲「膠水代碼」,從而允許您將膠水對象傳遞到POST,然後再從GET響應中讀取。

(這使用Node.js的request模塊類似於a documented technique

+0

[上次我檢查](http:// stackoverflow。 com/a/16247129/4279),'請求'無法做到這一點,而沒有在本地緩存整個有效載荷。你能提供一個完整的例子嗎? – jfs

+0

如果您不對文件進行多部分編碼,您可以這樣做。這涉及將原始文件類對象傳遞給數據參數,詳見答案。 =) – Lukasa