Python 请求 PUT 方法创建一个零字节文件
Python requests PUT method creates a zero byte file
我正在尝试使用 python 中的请求模块通过 PUT 上传文件。
我的代码是这样的:
with open(file, 'rb') as payload:
r = requests.put(url, data=payload, auth=('username', 'password'))
文件已创建,我收到响应 200,但它有 0 个字节。如果我没有做错什么,我怀疑我遇到了错误 here.
是这样吗?如果是,有没有我可以尝试的解决方法?
我也对 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 大小的文件)。难道requests模块也是同样的问题?
[编辑]一些额外的信息。
接收 PUT 的服务是 运行 在 ESXi 管理程序上。它有一个功能,如果你发出一个授权的 PUT 请求,它将请求的文件存储在 /tmp 中。服务器端正在工作(使用执行相同工作的 perl 脚本以及 curl 对其进行了测试)。
上传的文件是一个 .tgz 文件,位于我的本地文件系统中,url 的格式为 "http://esx-server/tmp/file.tgz"
。
看来确实存在某种错误。
我的解决方案是使用 urllib2。它不像要求的那样"clean"。但还是比我想象的要好。
我现在的工作代码是:
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)
我正在尝试使用 python 中的请求模块通过 PUT 上传文件。
我的代码是这样的:
with open(file, 'rb') as payload:
r = requests.put(url, data=payload, auth=('username', 'password'))
文件已创建,我收到响应 200,但它有 0 个字节。如果我没有做错什么,我怀疑我遇到了错误 here.
是这样吗?如果是,有没有我可以尝试的解决方法?
我也对 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 大小的文件)。难道requests模块也是同样的问题?
[编辑]一些额外的信息。
接收 PUT 的服务是 运行 在 ESXi 管理程序上。它有一个功能,如果你发出一个授权的 PUT 请求,它将请求的文件存储在 /tmp 中。服务器端正在工作(使用执行相同工作的 perl 脚本以及 curl 对其进行了测试)。
上传的文件是一个 .tgz 文件,位于我的本地文件系统中,url 的格式为 "http://esx-server/tmp/file.tgz"
。
看来确实存在某种错误。
我的解决方案是使用 urllib2。它不像要求的那样"clean"。但还是比我想象的要好。
我现在的工作代码是:
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)