Как применить уникальные имена файлов на Google Диске? - PullRequest
3 голосов
/ 24 апреля 2019

Я использую Google Drive, чтобы служить центральным местом для различных сценариев для хранения общих файлов. Тем не менее, я заметил, что несмотря на то, что Google Drive притворяется, что функционирует как файловая система, он не соблюдает обычные соглашения о файловой системе, такие как применение уникальных имен файлов. Это позволяет различным пользователям загружать отдельные файлы с одинаковыми именами файлов.

Есть ли способ предотвратить это?

Все мои скрипты используют один и тот же код для доступа к Drive API для загрузки файлов:

import os
import httplib2
from apiclient import discovery, errors
from apiclient.http import MediaFileUpload

credentials = get_google_drive_credentials()
service = discovery.build('drive', 'v2', http=credentials.authorize(httplib2.Http()))

dir_id = 'google_drive_folder_hash'
filename = '/some/path/blah.txt'
service.files().insert(
    body={
        'title': os.path.split(filename)[-1],
        'parents': [{'id': dir_id}],
    },
    media_body=MediaFileUpload(filename, resumable=True),
).execute()

Если два или более сценариев запускают это, и при условии отсутствия условий гонки, почему этот код приведет к дублирующим загрузкам «blah.txt»? Как бы мне предотвратить это?

1 Ответ

1 голос
/ 25 апреля 2019
  • Когда файл создан, вы хотите дать только одно имя файла в папке.
  • Если дублированное имя файла существует, вы не хотите создавать файл.
  • Вы хотите использовать Drive API v2.

Если мое понимание верно, как насчет этого ответа?В этом ответе добавлен процесс поиска дублированного имени файла в папке.Для этого я использовал метод files.list.Процесс выполнения этого сценария выглядит следующим образом.

  1. Извлечение файлов title в папку.
  2. Если дублированное имя файла НЕ существует, создается новый файл.
  3. Если дублированное имя файла уже существует, новые файлы НЕ создаются.

Пример сценария:

res = service.files().list(q="title='" + title + "' and '" + dir_id + "' in parents", fields="items(id,title)").execute()
if len(res['items']) == 0:
    # In this case, no duplicated filename is existing.
    service.files().insert(
        body={
            'title': title,
            'parents': [{'id': dir_id}],
        },
        media_body=MediaFileUpload(filename, resumable=True),
    ).execute()
else:
    # In this case, the duplicated filename is existing.
    # Please do error handling here, if you need.
    print("Duplicated files were found.")

Примечание:

  • Thisизмененный скрипт предполагает, что вы уже использовали Drive API.

Ссылки:

Если я неправильно понял ваш вопрос, а это не тот результат, который вам нужен, я приношу свои извинения.

...