我想将文件上传到网址。我要上传的文件不在我的电脑上,但我有文件的网址。我想使用请求库上传它。所以,我想做这样的事情:
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
但是,唯一不同的是,文件report.xls来自某个不在我电脑中的网址。
答案 0 :(得分:11)
执行此操作的唯一方法是下载网址正文,以便上传。
问题是需要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
几乎一切都很简单,并在文档中进行了解释。*
*好吧,最后一个例子不是 easy ...你必须从请求read
和write
获取原始套接字包装器,并确保你没有僵局,等等......
答案 1 :(得分:3)
文档中有an example可能适合您。类文件对象可以用作POST请求的流输入。将其与a stream response相结合以获取GET(传递stream=True
)或其他选项之一documented here。
这允许您从另一个GET执行POST而不在本地缓冲整个有效负载。在最坏的情况下,您可能必须将类似文件的类编写为“粘合代码”,允许您将粘合对象传递给POST,然后POST从GET响应中读取。
(这与使用Node.js a documented technique模块的request类似。)
答案 2 :(得分:0)
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)
以上代码对我有用。