驱动器 api:当语料库="用户"时返回不一致结果的文件列表



我在appengine上使用Drive Api,使用服务帐户进行身份验证。在我的Drive空间中,我与我的个人用户创建了许多文档,并与服务帐户共享。

+--_folderA
   +-- fileA1
   +-- fileA2
   +-- fileA3
   +--_folderB
      +-- fileB1
      +-- fileB2

如果我使用语料库='domain'调用file.list,我将正确获得与服务帐户共享的所有文件。

response = service.files().list(q="",
    spaces='drive',
    corpus='domain',
    fields='nextPageToken,
    files(id, name)',
    pageToken=page_token).execute()
RESULT: folderA, folderB, fileA1, fileA2, fileA3, fileB1, fileB2

但是,如果我使用corpus='user'调用file.list,我只获得与服务帐户共享的文件的子集。

response = service.files().list(q="",
    spaces='drive',
    corpus='user',
    fields='nextPageToken,
    files(id, name)',
    pageToken=page_token).execute()
RESULT: fileA2, fileB1

这种行为特别奇怪,因为我找不到任何标准,有些文件被返回,有些则没有。事实上,与服务帐户共享的所有文件都具有相同的属性
此外,如果我在parents文件夹上添加一个带有子句的查询(并且corpus='user'),我会看到更多的文件,这对我来说很奇怪,因为我正在缩小搜索空间。

response = service.files().list(q="folderA_ID in parents",
    spaces='drive',
    corpus='user',
    fields='nextPageToken,
    files(id, name)',
    pageToken=page_token).execute()
RESULT: fileA1, fileA2, fileA3

我使用Java和Python获得了相同的结果。

谷歌解释了发生这种情况的原因:

在发出"文件列表"请求时,语料库参数设置为"用户",其行为是返回MyDrive中的所有文件以及与您共享的文件,即使这些文件是共享驱动器中的文件但是,当请求用户对共享驱动器(管理器、查看器、参与者等)具有权限时,有一个例外,在这种情况下,除非用户与文件进行了任何交互(创建/打开/共享给其他人的文件),否则Files.List请求不会检索共享驱动器中的文件(尽管对其中的所有文件都具有权限)

官方文件中没有说明上述行为的例外情况。我打开了一个内部问题,以便更新文档。

对于您期望的行为,您可以将语料库参数设置为"allDrives",它将从MyDrive中检索所有文件、与您共享的文件以及您有权限访问的共享驱动器中的所有文件。

在我看来,这是令人困惑的,但我认为从API的角度来看,这样做的目的是允许API向用户返回与相关的文件,而不是用户可以访问的所有文件。当用户是共享驱动器上的Manager、Viewer、Contributor等时,后一个列表可能相当大,用户可能对大部分内容不感兴趣。

服务帐户有自己的Google Drive帐户。因此,它拥有的文件和与它共享的文件之间存在差异

可接受的值为:
"域":共享到用户域的文件
"user":用户拥有或共享的文件。(默认)

当您请求domain时,您要求查看它可以访问的所有文件。这些文件就是您的文件。当您说users时,您要求的是服务帐户个人拥有的文件。检查文件的权限我想你会了解为什么有些文件正在返回,而另一些文件没有返回。

有关域的更多信息

最新更新