Python 请求发布一个文件

新手上路,请多包涵

使用 CURL 我可以发布一个文件

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

我的文件看起来像

$ cat boot.txt
line 1
line 2
line 3

我正在尝试使用 python 中的 请求 模块来实现同样的事情

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"}

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

原文由 user1191140 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 419
2 个回答

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

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

原文由 shad0w_wa1k3r 发布,翻译遵循 CC BY-SA 4.0 许可协议

您正在执行的两个操作不相同。

首先:您使用 cat 显式读取文件并将其传递给 curl 指示它使用它作为标头的值 pxeconfig

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

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

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

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

 curl -F "header=@filepath" url

原文由 xrisk 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题