Я боролся с этим в течение нескольких дней. Я пытаюсь, чтобы пользователи загружали аватар (очень маленький файл изображения) непосредственно в мою учетную запись на Диске из элемента ввода 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 Диск.
- Добавьте пару ключ-значение
parents
кbody
MediaFileUpload
. Хосту запроса будут автоматически переданыmultipart
закодированные данные. - Убедитесь, что адрес электронной почты служебной учетной записи имеет права доступа к этой папке (вы также можете сделать это через пользовательский интерфейс 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()