Как сделать загрузку файла в указанную папку напрямую, используя родительский идентификатор папки - PullRequest
0 голосов
/ 16 февраля 2019

После того, как я выяснил, как загрузить файл размером более 512 МБ, я обнаружил еще одну проблему: я не знаю, как сделать мой файл загруженным в указанную папку, используя идентификатор родительской папки.

В моемпредыдущий код я мог загрузить файл прямо в папку, но теперь я не могу

import os
import httplib2
import zipfile
import ntpath
import oauth2client
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
from oauth2client.client import OAuth2WebServerFlow

# Copy your credentials here
_CLIENT_ID = 'YOUR_CLIENT_ID'
_CLIENT_SECRET = 'YOUR_CLIENT_SECRET'
_REFRESH_TOKEN = 'YOUR_REFRESH_TOKEN'
_PARENT_FOLDER_ID = 'YOUR_PARENT_FOLDER_ID'

# ====================================================================================

# Upload file to Google Drive
def UploadFile(client_id, client_secret, refresh_token, local_file, parent_folder_id):
    cred = oauth2client.client.GoogleCredentials(None,client_id,client_secret,refresh_token,None,'https://accounts.google.com/o/oauth2/token',None)
    http = cred.authorize(httplib2.Http())
    drive_service = build('drive', 'v2', http=http)
    media_body = MediaFileUpload(local_file, mimetype='application/octet-stream', chunksize=10485760, resumable=True)
    body = {
        'title': (ntpath.basename(local_file)),
        'parents': [parent_folder_id], # <-- Here is the problem, actualy i don't know how to make it upload to specified folder directly
        'mimeType': 'application/octet-stream'
    }
    request = drive_service.files().insert(body=body, media_body=media_body)
    response = None
    while response is None:
        status, response = request.next_chunk()
        if status:
                print "Uploaded %.2f%%" % (status.progress() * 100)
    print "Upload Complete!"

# ====================================================================================


if __name__ == '__main__':
    UploadFile(_CLIENT_ID, _CLIENT_SECRET, _REFRESH_TOKEN, 'bigfile.zip', _PARENT_FOLDER_ID)

1 Ответ

0 голосов
/ 16 февраля 2019

В вашем скрипте обнаружено, что вы пытаетесь использовать Drive API v2 из drive_service = build('drive', 'v2', http=http) и тело запроса.Я думаю, что для вашей модификации есть 2 шаблона.

Шаблон 1:

Когда вы используете Drive API v2, измените его следующим образом.

От:

'parents': [parent_folder_id]

Кому:

'parents': [{'id': parent_folder_id}]}

Шаблон 2:

При использовании Drive API v3 измените его следующим образом.В этом случае вы можете использовать 'parents': [parent_folder_id].Но другие части необходимо изменить для v3.

С:

drive_service = build('drive', 'v2', http=http)
media_body = MediaFileUpload(local_file, mimetype='application/octet-stream', chunksize=10485760, resumable=True)
body = {
    'title': (ntpath.basename(local_file)),
    'parents': [parent_folder_id],
    'mimeType': 'application/octet-stream'
}
request = drive_service.files().insert(body=body, media_body=media_body)

С:

drive_service = build('drive', 'v3', http=http)  # Modified
media_body = MediaFileUpload(local_file, mimetype='application/octet-stream', chunksize=10485760, resumable=True)
body = {
    'name': (ntpath.basename(local_file)),  # Modified
    'parents': [parent_folder_id],
    'mimeType': 'application/octet-stream'
}
request = drive_service.files().create(body=body, media_body=media_body)  # Modified

Примечание:

  • О программе ваш предыдущий код , в этом скрипте используется Drive API v3.Но когда я увидел тему, которую я вам представил, был использован Drive API v2.Прошу прощения за смущение.

Ссылки:

Если это изменение не сработало, я прошу прощения.

...