使用请求库从url上传Python文件

时间:2013-08-29 17:50:33

标签: python python-requests

我想将文件上传到网址。我要上传的文件不在我的电脑上,但我有文件的网址。我想使用请求库上传它。所以,我想做这样的事情:

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

但是,唯一不同的是,文件report.xls来自某个不在我电脑中的网址。

3 个答案:

答案 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 ...你必须从请求readwrite获取原始套接字包装器,并确保你没有僵局,等等......

答案 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)

以上代码对我有用。