当corpus ='user'时,驱动器api:file.list返回不一致的结果

时间:2016-05-12 10:57:49

标签: google-app-engine google-drive-api

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

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

如果我使用 corpus ='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

这种行为特别奇怪,因为我找不到某些文件被返回的标准,有些文件没有。实际上,与服务帐户共享的所有文件都具有相同的属性 此外,如果我在父文件夹(和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获得相同的结果。

2 个答案:

答案 0 :(得分:0)

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

  

Acceptable values are
     “域”:共享到用户域的文件       “user”:用户拥有或共享的文件。 (默认)

当您请求domain时,您要求查看它有权访问的所有文件。那些是你的文件。当您说users时,您要求提供服务帐户个人拥有的文件。检查文件permissions我的猜测是你会了解一些文件返回的原因而其他文件没有。

有关domain

的更多信息

答案 1 :(得分:0)

Google有explained发生这种情况的原因:

  

在发出corpora参数设置为“ user”的Files.List请求时,行为是返回MyDrive中的所有文件以及与您共享的文件,即使它们是共享驱动器中的文件。 但是,当发出请求的用户对共享驱动器(管理器,查看器,贡献者等)具有权限时,这是一个例外,在这种情况下,Files.List请求将不会在共享驱动器中检索文件(尽管拥有其中所有文件的权限),除非用户与该文件有任何交互(已创建,打开/共享给其他人,即文件)。

     

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

     

对于您期望的行为,可以将corpora参数设置为“ allDrives”,它将从MyDrive中检索所有文件,与您共享的文件以及您有权访问的共享驱动器中的所有文件。 / p>

我认为这很令人困惑,但是我认为从API角度来看,其目的是允许API向用户返回与相关的文件,而不是与用户< em>可以访问。当用户是共享驱动器上的Manager,Viewer,Contributer等时,后者的列表可能会很大,并且用户可能对大部分内容不感兴趣。