我想将文件上传到 url。我要上传的文件不在我的电脑上,但我有文件的 url。我想使用请求库上传它。所以,我想做这样的事情:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
但是,唯一的区别是,report.xls 文件来自一些不在我的计算机中的 url。
我想将文件上传到 url。我要上传的文件不在我的电脑上,但我有文件的 url。我想使用请求库上传它。所以,我想做这样的事情:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
但是,唯一的区别是,report.xls 文件来自一些不在我的计算机中的 url。
执行此操作的唯一方法是下载 URL 的正文,以便您可以上传它。
问题是采用 a 的表单file
在 HTTP POST 中需要文件的正文。有人可以编写一个采用 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
and中取出原始套接字包装器write
,并确保你不会死锁,等等……</p>
文档中有一个可能适合您的示例。类似文件的对象可以用作 POST 请求的流输入。将此与您的 GET(通过)的流响应或此处记录stream=True
的其他选项之一结合起来。
这允许您从另一个 GET 执行 POST,而无需在本地缓冲整个有效负载。在最坏的情况下,您可能必须编写一个类似文件的类作为“粘合代码”,允许您将粘合对象传递给 POST,该 POST 又从 GET 响应中读取。
import requests
img_url = "http://...."
res_src = requests.get(img_url)
payload={}
files=[
('files',('image_name.jpg', res_src.content,'image/jpeg'))
]
headers = {"token":"******-*****-****-***-******"}
response = requests.request("POST", url, headers=headers, data=payload, files=files)
print(response.text)
上面的代码对我有用。