繁体   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