web-dev-qa-db-fra.com

Fichiers de téléchargement de l'API Google Drive - python - aucun fichier téléchargé

J'ai essayé un certain nombre de façons de télécharger des fichiers à partir de Google Drive via oauth et l'API, mais je ne suis pas en mesure d'obtenir les fichiers téléchargés. Je pense que je me suis correctement authentifié. Après avoir exécuté mon code , il semble que le téléchargement du fichier ait réussi (pas d'erreur), mais aucun fichier n'a été téléchargé.

Voici le code que j'ai essayé jusqu'à présent:

def download_file(file_id, mimeType):
    if "google-apps" in mimeType:
        return
    request = drive_service.files().get(fileId=file_id)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print "Download %d%%." % int(status.progress() * 100)

Cependant, cela se traduit par "Télécharger 100%". en cours d'impression sur la console, mais aucun fichier téléchargé.

J'ai aussi essayé:

def download2(download_url):
    resp, content = drive_service._http.request(download_url)
    if resp.status == 200:
        print 'Status: %s' % resp
        return content
    else:
        print 'An error occurred: %s' % resp
        return None

Cela ne produit pas non plus de fichier téléchargé, mais cela me donne un message de 200.

Ces deux éléments semblent avoir pris correctement contact avec l'API. Y a-t-il une étape supplémentaire que je dois faire pour obtenir les fichiers sur mon ordinateur?

Éditer:

c'était le reste de mon code:

import json
import webbrowser

import httplib2
import io
from apiclient.http import MediaIoBaseDownload

from apiclient import discovery
from oauth2client import client

if __name__ == '__main__':
  flow = client.flow_from_clientsecrets(
    'client_secrets.json',
    scope='https://www.googleapis.com/auth/drive.readonly',
    redirect_uri='urn:ietf:wg:oauth:2.0:oob')

  auth_uri = flow.step1_get_authorize_url()
  webbrowser.open(auth_uri)

  auth_code = raw_input('Enter the auth code: ')

  credentials = flow.step2_exchange(auth_code)
  http_auth = credentials.authorize(httplib2.Http())

  drive_service = discovery.build('drive', 'v3', http_auth) #also tried v2
  files = drive_service.files().list().execute()
  for f in files['files']:
    #call one of the two download methods with the proper arguments
18
user1253952

Le passage de BytesIO à FileIO a permis au fichier d'être réellement téléchargé. C'est la ligne que j'ai modifiée mon code pour:

fh = io.FileIO(filename, 'wb')

Voici le code complet qui m'a permis de télécharger le fichier:

def download_file(file_id, mimeType, filename):
    if "google-apps" in mimeType:
        # skip google files
        return
    request = drive_service.files().get_media(fileId=file_id)
    fh = io.FileIO(filename, 'wb')
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print "Download %d%%." % int(status.progress() * 100)


if __name__ == '__main__':
    flow = client.flow_from_clientsecrets(
      'client_secrets.json',
      scope='https://www.googleapis.com/auth/drive.readonly',
      redirect_uri='urn:ietf:wg:oauth:2.0:oob')

    auth_uri = flow.step1_get_authorize_url()
    webbrowser.open(auth_uri)

    print auth_uri

    auth_code = raw_input('Enter the auth code: ')

    credentials = flow.step2_exchange(auth_code)
    http_auth = credentials.authorize(httplib2.Http())

    drive_service = discovery.build('drive', 'v3', http_auth)
    files = drive_service.files().list().execute()
    for f in files['files']:
        print f['name']
        download_file(f['id'], f['mimeType'], f['name'])
25
user1253952

Le fichier est en cours de téléchargement, mais l'exemple donné par Google ne fait rien avec le fichier.

Il vous suffit de renvoyer le contenu du tampon BytesIO comme ceci (en ajoutant simplement un retour à la fin) ...

def download_file(service, file_id):
    request = service.files().get_media(fileId=file_id)
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))
    return fh.getvalue()
10
Ryan Parrish