2014-05-11 4 views
2

J'essaie d'utiliser la bibliothèque de requêtes python pour envoyer un fichier à Google Drive api. La seule chose dont j'ai besoin pour envoyer une requête multipart selon google documentation https://developers.google.com/drive/web/manage-uploads#multipart Je dois d'abord envoyer les méta-données puis le fichier. Voici ce que j'ai essayé jusqu'à présentDemande Python pour Google Drive

def upload_csv(self, file, description): 
     self.refresh() 
     url = self.url+'?uploadType=multipart&' + urllib.urlencode({'key':self.api_key}) 

     headers = { 'Authorization':'Bearer {}'.format(self.access_token), 
    #     'content-type':'multipart/related', 
    #     'content-length':size 
       } 

     data = {'title':file,'description':description } 
     files = {'file':(file,open(file,'rb'),'text/csv')} 
     response = requests.post(url, headers = headers, data = data, files = files) 

mais je reçois une erreur: type de contenu u'Bad. S'il vous plaît utiliser multipart. Y at-il un moyen d'envoyer des métadonnées et le fichier en utilisant les demandes

+0

Quelle est la version de 'requests'? 2.x produit déjà une requête compatible. –

+0

Possiblement lié: [Comment organiser l'ordre des données et des fichiers en utilisant les demandes d'envoi de multipart/form-data?] (Http://stackoverflow.com/q/21091802), mais c'est pour le * reverse * de ce que vous voulez . –

Répondre

3

J'ai trouvé un moyen de le faire. Le problème est que Google veut les méta-données et le fichier ensemble.

def upload_csv(self, file, description): 
     self.refresh() 
     url = self.url+'?uploadType=multipart&convert=true' + urllib.urlencode({'key':self.api_key}) 

     headers = { 'Authorization':'Bearer {}'.format(self.access_token) } 

     class DataDict(dict): 
      def read(self): 
       return str(self) 

     data = ('metadata',DataDict(title = file,description = description),'application/json; charset=UTF-8') 
     file = (file,open(file,'rb'),'text/csv') 
     files = {'data':data, 'file':file } 
     response = requests.post(url, headers = headers, files = files) 
     return respone 
+1

Vous produisez indirectement JSON; utilisez simplement le module 'json' pour produire l'entrée des métadonnées. –