簡體   English   中英

使用請求庫從url上傳Python文件

[英]Python file upload from url using requests library

我想將文件上傳到網址。 我要上傳的文件不在我的電腦上,但我有文件的網址。 我想使用請求庫上傳它。 所以,我想做這樣的事情:

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

但是,唯一不同的是,文件report.xls來自一些不在我的計算機中的URL。

唯一的方法是下載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原始套接字包裝器,並確保你沒有死鎖,等等......

文檔中有一個可能適合您的示例 類文件對象可以用作POST請求的流輸入。 將此與您的GET 的流響應 (傳遞stream=True )或此處記錄的其他選項之一相結合。

這允許您從另一個GET執行POST而不在本地緩沖整個有效負載。 在最壞的情況下,您可能必須編寫類似文件的類作為“粘合代碼”,允許您將粘合對象傳遞給POST,而POST又從GET響應中讀取。

(這類似於使用Node.js 請求模塊的文檔化技術 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM