Как загрузить бинарный / видео файл, используя метод PUT http.client Python?
Я общаюсь с API, используя HTTP.client в Python 3.6.2.
Для загрузки файла требуется трехэтапный процесс.
Мне удалось успешно общаться с помощью методов 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 ответа
uploadstep2.request("PUT", myUniqueUploadUrl, body="C:\Test.mp4", headers=headers)
поместит фактическую строку "C:\Test.mp4"
в теле вашего запроса, а не в содержимом файла с именем "C:\Test.mp4"
как вы ожидаете.
Вам нужно открыть файл, прочитать его содержимое и передать его как тело. Или для потоковой передачи, но AFAIK http.client
не поддерживает это, и так как ваш файл выглядит как видео, он потенциально огромен и будет использовать много оперативной памяти без веской причины.
Мое предложение будет использовать requests
, что намного лучше, чтобы делать такие вещи:
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())
Я не знаю, полезно ли это для вас, но вы можете попробовать отправить запрос 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)
Надеюсь, поможет.