2017-09-26 6 views
0

Je communique avec une API en utilisant HTTP.client dans Python 3.6.2.Comment télécharger un fichier binaire/vidéo à l'aide de la méthode Python http.client PUT?

Pour télécharger un fichier, il faut un processus en trois étapes.

J'ai réussi à parler avec succès en utilisant des méthodes POST et le serveur renvoie des données comme je l'espère. Cependant, l'étape qui nécessite le téléchargement du fichier réel est une méthode PUT - et je n'arrive pas à comprendre comment syntaxe le code pour inclure un pointeur sur le fichier réel sur mon stockage - le fichier est un fichier vidéo mp4 . Voici un extrait du code avec mes annotations 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() 

La réponse Je reviens à ce stade est un « Erreur 400 Bad Request - Impossible d'obtenir les informations du fichier. »

Je suis certain que cela se rapporte à la section body = "C: \ Test.mp4" du code.

Pouvez-vous s'il vous plaît indiquer comment je peux correctement référencer un fichier dans la méthode PUT?

Merci à l'avance

Répondre

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

placera la chaîne réelle "C:\Test.mp4" dans le corps de votre demande, et non pas le contenu du fichier nommé "C:\Test.mp4" comme prévu.

Vous devez ouvrir le fichier, lire son contenu, puis le transmettre en tant que corps. Ou pour le diffuser, mais AFAIK http.client ne supporte pas cela, et puisque votre fichier semble être une vidéo, il est potentiellement énorme et utilisera beaucoup de RAM sans raison valable.

Ma suggestion serait d'utiliser requests, ce qui est une façon meilleure lib pour faire ce genre de choses:

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()) 
+0

Rebord. Travaillé comme un charme, merci! – yekootmada

0

Je ne sais pas s'il est utile pour vous, mais vous pouvez essayer d'envoyer un Demande POST avec module de demandes:

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) 

Espérons que cela aide.