Python请求发送文件(使用requests库)

6
使用 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个回答

10

您的curl请求将文件内容作为表单数据发送,而不是作为实际文件!您可能需要像下面这样的内容:

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

2

你所执行的两个操作并不相同。

在第一个例子中,你使用 cat 显式地读取文件,并将其作为头部 pxeconfig 的值传递给 curl。

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

要获得与 curl 命令相同的行为,你应该执行以下操作:

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

如果您实际上想要发送文件进行多部分编码,则对比使用 curl 请求如下:

curl -F "header=@filepath" url

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

您可能希望这样做,以便文件在之后也关闭。
更多信息请查看:使用Python脚本通过POST发送文件

这是发布文件的正确模式,但在这种情况下,OP想要发布文件内容,而不是文件本身。 - ggorlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接