Python请求发布文件

时间:2017-04-06 06:00:09

标签: python python-2.7 python-3.x

使用CURL我可以发布像

这样的文件
CURL -X POST -d "pxeconfig=`cat boot.txt`" https://ip:8443/tftp/syslinux

我的文件看起来像

$ cat boot.txt
line 1
line 2
line 3

我正在尝试使用python中的 requests 模块实现相同的功能

r=requests.post(url, files={'pxeconfig': open('boot.txt','rb')})

当我在服务器端打开文件时,该文件包含

{:filename=>"boot.txt", :type=>nil, :name=>"pxeconfig", 
:tempfile=>#<Tempfile:/tmp/RackMultipart20170405-19742-1cylrpm.txt>, 
:head=>"Content-Disposition: form-data; name=\"pxeconfig\"; 
filename=\"boot.txt\"\r\n"}

请建议我如何实现这一目标。

3 个答案:

答案 0 :(得分:4)

您的curl请求将文件内容作为表单数据发送,而不是实际文件!你可能想要像

这样的东西
with open('boot.txt', 'rb') as f:
    r = requests.post(url, data={'pxeconfig': f.read()})

答案 1 :(得分:2)

您正在执行的两项行动并不相同。

在第一个:您使用cat明确读取文件并将其传递给curl,指示它将其用作标题pxeconfig的值。

然而,在第二个示例中,您使用的是多部分文件上载,这是完全不同的事情。在这种情况下,服务器应该解析收到的文件。

要获得与curl命令相同的行为,您应该这样做:

requests.post(url, data={'pxeconfig': open('file.txt').read()})

相比之下curl请求,如果你真的想发送多段编码的文件是这样的:

curl -F "header=@filepath" url

答案 2 :(得分:0)

with open('boot.txt', 'rb') as f: r = requests.post(url, files={'boot.txt': f})

您可能希望做类似的事情,以便之后文件也会关闭。

点击此处了解详情:Send file using POST from a Python script