7

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

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

但是,唯一的区别是,report.xls 文件来自一些不在我的计算机中的 url。

4

3 回答 3

13

执行此操作的唯一方法是下载 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,并且在文档中得到了很好的解释。*


* 好吧,最后一个例子不太容易……你必须从请求和readand中取出原始套接字包装器write,并确保你不会死锁,等等……</p>

于 2013-08-29T18:04:55.457 回答
3

文档中有一个可能适合您的示例。类似文件的对象可以用作 POST 请求的流输入。将此与您的 GET(通过)的流响应或此处记录stream=True的其他选项之一结合起来。

这允许您从另一个 GET 执行 POST,而无需在本地缓冲整个有效负载。在最坏的情况下,您可能必须编写一个类似文件的类作为“粘合代码”,允许您将粘合对象传递给 POST,该 POST 又从 GET 响应中读取。

(这类似于使用 Node.js请求模块的文档化技术。)

于 2013-08-29T18:28:43.613 回答
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)

上面的代码对我有用。

于 2021-05-28T17:35:28.410 回答