Python 请求 PUT 方法创建一个零字节文件



我正在尝试使用 python 中的请求模块上传带有 PUT 的文件。

我的代码是这样的:

with open(file, 'rb') as payload:
    r = requests.put(url, data=payload, auth=('username', 'password'))

文件已创建,我收到响应 200,但它有 0 个字节。如果我没有做错什么,我怀疑我在这里遇到了错误。

是这样吗?如果是,我可以尝试任何解决方法吗?

我也尝试过同样的 httplib2 库

with open(file, 'rb') as payload:
    h = httplib2.Http(".cache")
    h.add_credentials('user', 'pass')
    resp, content = h.request(url, "PUT", body=payload)

但是请求永远保持挂起状态(再次创建一个 0 大小的文件)。请求模块也可能是同样的问题吗?

[编辑] 一些额外的信息。

接收 PUT 的服务正在 ESXi 虚拟机监控程序上运行。它有一个功能,如果你发出一个经过身份验证的PUT请求,它会将请求的文件存储在/tmp中。服务器端正在工作(使用perl脚本对其进行了测试,该脚本执行相同的工作以及curl)。

上传的文件是一个 .tgz 文件,它位于我的本地文件系统上,网址是 "http://esx-server/tmp/file.tgz" 的形式。

所以似乎确实存在某种错误。

我的解决方案是使用 urllib2。它不像请求那样"干净"。但仍然比我想象的要好。

我现在的工作代码是:

import urllib2
from base64 import b64encode
with open(source, 'rb') as file:
    data = file.read()
request = urllib2.Request(url)
request.add_data(data)
request.add_header('Authorization', 'Basic ' + b64encode(username + ':' + password))
request.get_method = lambda: "PUT"
r = urllib2.urlopen(request)

相关内容

最新更新