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
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'])
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()