如何在Google云端硬盘上强制使用唯一的文件名?

时间:2019-04-24 18:31:53

标签: python flysystem-google-drive

我正在使用Google云端硬盘作为各种脚本存储公用文件的中心。但是,我注意到,尽管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 个答案:

答案 0 :(得分:1)

  • 创建文件后,您只希望在一个文件夹中提供一个文件名。
  • 存在重复的文件名时,您不想创建文件。
  • 您要使用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.")

注意:

  • 此修改后的脚本假定您已经使用了Drive API。

参考文献:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。