如何使用Python http.client PUT方法上传二进制/视频文件?

时间:2017-09-26 14:43:44

标签: python methods upload binary http.client

我正在使用Python 3.6.2中的HTTP.client与API进行通信。

要上传文件,需要三个阶段的过程。

我设法使用POST方法成功谈话,服务器按照我的预期返回数据。

但是,需要上传实际文件的阶段是PUT方法 - 我无法弄清楚如何将代码语法化以包含指向我存储器上实际文件的指针 - 该文件是mp4视频文件。 以下是我的noob注释的代码片段:)

#define connection as HTTPS and define URL
uploadstep2 = http.client.HTTPSConnection("grabyo-prod.s3-accelerate.amazonaws.com")

#define headers
headers = {
    'accept': "application/json",
    'content-type': "application/x-www-form-urlencoded"
}

#define the structure of the request and send it.
#Here it is a PUT request to the unique URL as defined above with the correct file and headers.
uploadstep2.request("PUT", myUniqueUploadUrl, body="C:\Test.mp4", headers=headers)

#get the response from the server
uploadstep2response = uploadstep2.getresponse()

#read the data from the response and put to a usable variable
step2responsedata = uploadstep2response.read()

我在这个阶段得到的回应是 “错误400错误请求 - 无法获取文件信息。”

我确信这与代码的 body =“C:\ Test.mp4”部分有关。

请告诉我如何在PUT方法中正确引用文件?

提前致谢

2 个答案:

答案 0 :(得分:0)

uploadstep2.request("PUT", myUniqueUploadUrl, body="C:\Test.mp4", headers=headers)

会将实际字符串"C:\Test.mp4"放在您请求的正文中,而不是您期望的名为"C:\Test.mp4"的文件的内容。

您需要打开文件,阅读它的内容然后将其作为正文传递。或者流式传输,但AFAIK http.client不支持,并且因为你的文件似乎是一个视频,它可能是巨大的,并且没有充分的理由会使用大量的RAM。

我的建议是使用requests,这是一种更好的lib来做这类事情:

import requests
with open(r'C:\Test.mp4'), 'rb') as finput:
   response = requests.put('https://grabyo-prod.s3-accelerate.amazonaws.com/youruploadpath', data=finput)
   print(response.json())

答案 1 :(得分:0)

我不知道它是否对您有用,但您可以尝试使用请求模块发送POST请求:

import requests
url = ""
data = {'title':'metadata','timeDuration':120}
mp3_f = open('/path/your_file.mp3', 'rb')
files = {'messageFile': mp3_f}

req = requests.post(url, files=files, json=data)
print (req.status_code)
print (req.content)

希望它有所帮助。