我想將文件上傳到網址。我想要上傳的文件不在我的計算機上,但是我有該文件的網址。我想要使用請求庫來上傳它。所以,我想要做這樣的事情:使用請求庫從url上傳Python文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
但唯一不同的是,文件report.xls來自一些不在我的電腦中的網址。
我想將文件上傳到網址。我想要上傳的文件不在我的計算機上,但是我有該文件的網址。我想要使用請求庫來上傳它。所以,我想要做這樣的事情:使用請求庫從url上傳Python文件
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
但唯一不同的是,文件report.xls來自一些不在我的電腦中的網址。
要做到這一點的唯一方法是下載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
,並在文檔很好地解釋。*
*嗯,這最後一個例子是不太容易...有你以獲取原始套接字包裝請求和read
和write
,並確保您沒有死鎖,依此類推...
在可能適合您的文檔中有an example。類文件對象可以用作POST請求的流輸入。將此與a stream response組合爲您的GET(通過stream=True
)或其他選項documented here之一。
這使您可以從另一個GET執行POST,而無需在本地緩衝整個有效負載。在最糟糕的情況下,您可能必須編寫一個類似文件的類作爲「膠水代碼」,從而允許您將膠水對象傳遞到POST,然後再從GET響應中讀取。
(這使用Node.js的request模塊類似於a documented technique)
下載它第一次? –
這似乎不是一個好的解決方案。可以? – Rishi
你還打算怎麼做?接受文件的表單需要您將文件的數據發送到「POST」主體,這意味着您必須獲取URL的數據才能發送它。 (當然有人可以編寫一個表單,它會爲你提供一個URL並將其提供給你,但這與接受文件的請求不同)。 – abarnert