Google Drive REST API 获取文件仅返回 404,范围为“drive.file”

问题描述 投票:0回答:8

我正在使用 Google Drive REST API V3 来访问该文件。基本的 api 网址是: https://www.googleapis.com/drive/v3/files/fileid

标头包含密钥:使用从 oauth 获得的 Bearer 访问令牌进行授权。

但是,如果您创建一个普通的谷歌文档,这是可行的。回复是:

{
"id": "1v3V0BWcWtYu_K9OLm1rffHA3vj5Bz8SY-0-JpU7CiEc",
"name": "test",
"mimeType": "application/vnd.google-apps.document",
"parents": [
    "0AP75Wn-e9WDqUk9PVA"
]
}

但是如果我从 google template 创建了一个 google 文档,则会返回 404。见下文:

{
"error": {
    "errors": [
        {
            "domain": "global",
            "reason": "notFound",
            "message": "File not found: 14gHUCFTrwHaoZ88Kr0Qnn8OsUdzcU037GK7v-JI9L1I.",
            "locationType": "parameter",
            "location": "fileId"
        }
    ],
    "code": 404,
    "message": "File not found: 14gHUCFTrwHaoZ88Kr0Qnn8OsUdzcU037GK7v-JI9L1I."
}
}
google-drive-api
8个回答
4
投票

2021在这里回答,就我而言,问题(某些文件为404)的存在是因为我使用的Google项目编号是错误的

更难的是,有些帐户确实可以完美运行,而有些帐户则不仅仅使用此范围:

https://www.googleapis.com/auth/drive.file

正如选择器的谷歌文档中所示:

// Replace with your own project number from console.developers.google.com.
// See "Project number" under "IAM & Admin" > "Settings"
const appId = "1234567890";

项目编号确定后,一切都开始完美运行(不需要

https://www.googleapis.com/auth/drive
范围,因为它是一个免费的范围,为所有内容提供了权限)。

干杯。


2
投票

在此处填写此内容以供后代参考:当使用文件选择器的drive.file权限时,仅当选择器托管在与Google开发者控制台Drive SDK配置页面中配置的同一域中时,您收到的url/令牌才会起作用(https://console.developers.google.com/apis/api/drive.googleapis.com/drive_sdk)。

如果您将其托管在任何其他域上,当您尝试使用 URL 直接下载文件时,您将收到 404:您需要使用drive.readonly 或驱动器权限。


1
投票

我做了一些测试,发现“drive.file”范围实际上在获取文件元数据/内容方面存在一些问题。从文档中,“drive.file”允许应用程序访问由此应用程序创建的文件,或者用户使用此应用程序从驱动器或谷歌文档显式打开文件。当我测试这个时,实际上这并没有按预期工作。我上传了几个文件,其中一个文件可以由我的应用程序访问,但其他文件则不能。我记得当我发布我的应用程序时,Google Drive 团队审查了我的应用程序,并在范围内拒绝了几次,最终该应用程序仅通过了“drive.file”范围的审查。

有人遇到同样的问题吗?


1
投票

正如文档所述

drive.file
范围用于查看和管理您使用此应用程序打开或创建的Google Drive文件和文件夹。

我也鼓励404错误,我终于找到了解决方案,就我而言,我在前端使用Google Drive Picker来选择文件,然后我将文件ID发送到后端来下载它们,我有相同的

404 File not found
当我尝试下载文件时后端出现错误。

我看到错误是因为我没有在选择器 API 中设置 appId。 所以当我尝试实例化 googlePicker 时,我设置了应用程序密钥,然后一切都修复了。

// Replace with your own project number from console.developers.google.com.
// See "Project number" under "IAM & Admin" > "Settings"
var appId = "1234567890";

var picker = new google.picker.PickerBuilder()
            ...
            .setAppId(appId)
            ...
            .build(); 

现在后端和前端在谷歌中使用相同的应用程序,当用户从选择器API中选择一个文件时,它在所有应用程序中都可用。

更多信息:https://developers.google.com/picker/docs/


0
投票

但事实并非如此。我使用简历模板创建了一个谷歌文档。我获取了 fileID 并针对 files.get 运行它。我收到了 200 条回复:

{
 "kind": "drive#file",
 "id": "1y1h2vHYwrb57O-ein7VhqMwwJKtr4pP4N4bBow7-vus",
 "name": "resumeTemplate",
 "mimeType": "application/vnd.google-apps.document"
}

顺便说一句,

files.get
的 URI 请求是

https://www.googleapis.com/drive/v3/files/fileId

不是

https://www.googleapis.com/drive/v3/files/

0
投票

在我请求更多权限后,问题解决了。一切都没有改变。


0
投票

就我而言,它是关于设置

Drive.files().get(googleId).setSupportsAllDrives(true)
来访问共享驱动器上的文件。


0
投票

我需要请求 /auth/drive.readonly 访问权限

© www.soinside.com 2019 - 2024. All rights reserved.