【问题标题】:Google Drive API - Files stored in a GSuite Shared Drive (only) get a 404 errorGoogle Drive API - 存储在 GSuite 共享驱动器中的文件(仅)出现 404 错误
【发布时间】:2020-04-11 18:25:00
【问题描述】:

我的应用程序具有范围 drive.file、drive.readonly 和 drive.metadata.readonly。 使用https://github.com/googleapis/google-api-php-client v2.2.2

当以 Google Drive 用户身份验证时,它可以正常获取文件,但仅当这些文件由另一个用户(或同一用户)拥有时。

存储在共享云端硬盘(G Suite 商务版功能)并与用户共享的文件会导致 404 错误:

 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "notFound",
    "message": "File not found: 1gasqkgWcabla8sksT5FUtZGzlfIwGbc_aI4g2gl9bla.",
    "locationType": "parameter",
    "location": "fileId"
   }
  ],
  "code": 404,
  "message": "File not found: 1gasqkgWcabla8sksT5FUtZGzlfIwGbc_aI4g2gl9bla."
 }

我已验证该用户确实可以通过 Drive/Docs 等读取相关文件。

我已进入 API 控制台并检查了 Drive UI 集成下的“共享驱动器支持” - 这没有任何区别。 增加更广泛的“驱动”范围也无济于事。

【问题讨论】:

  • 我刚刚尝试过,对我来说工作得很好,也许是共享问题。你是怎么分享的。尝试访问页面 drive.google.com/file/d/1gasqkgWcabla8sksT5FUtZGzlfIwGbc_aI4g2gl9bla。与您共享的帐户。还要确保您使用的 ID 是正确的。从official documentation 开始,您的 ID 不应包含点 (".")。
  • 我已经确定该用户帐户可以打开相关文件。点只是错误信息的结尾,实际使用的 ID 没有点。该代码和流程适用于许多用户,直到有人注意到他们只能从个人驱动器打开文件。我现在已经重现并确认了这个问题,它似乎是共享驱动器特有的。

标签: google-drive-api


【解决方案1】:

经过测试,我发现了同样的问题。

当我尝试使用以下 HTTP 请求从共享驱动器获取文件时

GET /drive/v3/files/<ID-file> HTTP/1.1
Host: www.googleapis.com
Content-length: 0
Authorization: Bearer <access Token>

我遇到了和你一样的错误:

{
  "error": {
    "code": 404, 
    "message": "File not found: 1DIM-vS4058e0X5eutNmOqSr3z0rA1Nqh.", 
    "errors": [
      {
        "locationType": "parameter", 
        "domain": "global", 
        "message": "File not found: 1DIM-vS4058e0X5eutNmOqSr3z0rA1Nqh.", 
        "reason": "notFound", 
        "location": "fileId"
      }
    ]
  }
}

但在阅读 the documentation 后,很明显您需要在 HTTP 请求中包含 supportsAllDrives 参数。

所以现在添加supportsAllDrives=true 我的请求如下:

GET /drive/v3/files/<File ID>?supportsAllDrives=true HTTP/1.1
Host: www.googleapis.com
Content-length: 0
Authorization: Bearer <access Token>>

然后我必须在响应中检索文件:

{
  "mimeType": "image/jpeg", 
  "kind": "drive#file", 
  "name": "file.jpg", 
  "driveId": "<Drive Id>", 
  "teamDriveId": "<Team Drive ID>", 
  "id": "<File ID>"
}

【讨论】:

  • 这确实是问题所在。我注意到这在 2020 年 6 月 1 日之后将不再需要。但是,我发现 PHP 库也需要更新,如 github.com/googleapis/google-api-php-client/issues/1637 中所述,否则在添加到 files->get() 时它无法识别参数打电话。
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2021-07-15
  • 2020-07-29
  • 1970-01-01
相关资源
最近更新 更多