2016-03-23 6 views
4

Я пробовал несколько способов загрузки файлов с диска Google через oauth и API, однако я не могу загрузить файлы. Я считаю, что я правильно аутентифицирован. После запуска моего кода, похоже, что было успешное скачивание файла (без ошибок), но файлы не были загружены.Файлы загрузки API для Google Диска - python - файлы не загружены

Это код, который я пытался до сих пор:

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) 

Однако это приводит к "Скачать 100%." печатается на консоль, но файл не загружается.

Я также попытались:

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 

Это также не производит загруженный файл, но он дает мне 200 сообщений.

Оба эти устройства выглядят так, как будто они правильно вступают в контакт с API. Есть ли еще один шаг, который я должен сделать, чтобы фактически получить файлы на моем компьютере?

Edit:

это остаток моего кода:

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 

ответ

6

Переход от BytesIO к FileIO позволило файл на самом деле быть загружены. Это была линия, которую я изменил мой код:

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

Вот полный код, который позволил мне скачать файл:

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']) 
+0

является кодом аутентификации идентификатор файла в драйвере? – mp252

+0

Нет. Что происходит, так это то, что auth_uri будет сгенерированным URL-адресом, который вам нужно будет отправить владельцу учетной записи. Когда они получат доступ к этой ссылке, они должны будут одобрить вас, тогда вам будет предоставлен код, который они должны будут отдать вам. Затем вы должны ввести этот код. Помните, что код действителен только один раз и в течение ограниченного времени (возможно, 15 минут). – user1253952

2

Файл загрузки, но пример, приведенный гугле ничего с файлом не делать.

Вам просто нужно вернуть содержимое буфера BytesIO как это (просто добавив возвращение в конце) ...

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

hrmm, поэтому я добавил с открытым (именем файла, «термометр») в качестве выходного сигнала: \t \t fh.seek (0) \t \t output.write (fh.read()) до конца функции download_file. Но это просто загрузка метаданных файла. – user1253952

+0

@ user1253952 'HTML = download_file (услуга 'file_id') с открытым ('FILE.CSV', 'термометру'), как F: f.write (HTML)' –

Смежные вопросы