На самом деле ни один файл не загружен на Google Диск с использованием API версии 3.

Я боролся с этим в течение нескольких дней. Я пытаюсь, чтобы пользователи загружали аватар (очень маленький файл изображения) непосредственно в мою учетную запись на Диске из элемента ввода HTML.

Я создал учетную запись службы и в приведенном ниже коде использую ее учетные данные для выполнения загрузки.

img_path исходит из элемента ввода.

    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaFileUpload

    credentials_file = os.path.dirname(os.path.realpath(__file__)) + '/mycredentials-cad0bbacb5f8.json'

    credentials = service_account.Credentials.from_service_account_file(
        credentials_file)

    scoped_credentials = credentials.with_scopes(
        ['https://www.googleapis.com/auth/drive'])

    service = build('drive', 'v3', credentials=scoped_credentials)

    body = {
        'name': img_path.split("/")[-1],
    }

    media_body = MediaFileUpload(
            img_path,
            mimetypes.guess_type(img_path)[0],
    )

    file = service.files().create(body=body, media_body=media_body).execute()

Я получаю следующий вывод, что и ожидалось, но я не вижу файл нигде в своей учетной записи Google Диска:

{'kind': 'drive#file', 'id': '<FILE_ID>', 'name': '<UPLOADED_FILE>', 'mimeType': '<MIME_TYPE>'}

Что я делаю не так?

ОБНОВИТЬ

Я наткнулся на этот пост, где сказано, что, по-видимому, я загружаю файлы в пространство Google Диска учетной записи службы, а не в свое своя.

ОБНОВЛЕНИЕ №2

Код, который я разместил выше, на самом деле правильный, но следует указать на несколько вещей, чтобы он загружался на ваш личный Google Диск.

  1. Добавьте пару ключ-значение parents к body MediaFileUpload. Хосту запроса будут автоматически переданы multipart закодированные данные.
  2. Убедитесь, что адрес электронной почты служебной учетной записи имеет права доступа к этой папке (вы также можете сделать это через пользовательский интерфейс Google Диска).

Рабочий код, включая пару parents, выглядит следующим образом:

    from google.oauth2 import service_account
    from googleapiclient.discovery import build
    from googleapiclient.http import MediaFileUpload

    credentials_file = os.path.dirname(os.path.realpath(__file__)) + '/mycredentials-cad0bbacb5f8.json'

    credentials = service_account.Credentials.from_service_account_file(
        credentials_file)

    scoped_credentials = credentials.with_scopes(
        ['https://www.googleapis.com/auth/drive'])

    service = build('drive', 'v3', credentials=scoped_credentials)

    body = {
        'name': img_path.split("/")[-1],
        'parents': '<FOLDER-ID>'
    }

    media_body = MediaFileUpload(
            img_path,
            mimetypes.guess_type(img_path)[0],
    )

    file = service.files().create(body=body, media_body=media_body).execute()

person Niccolò Mineo    schedule 14.09.2019    source источник
comment
Полезна ли эта тема в вашей ситуации? stackoverflow.com/q/56957908/7108653   -  person Tanaike    schedule 15.09.2019
comment
Спасибо, как-то полезно было узнать, что не работает в моем.   -  person Niccolò Mineo    schedule 16.09.2019