我正在使用 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."
}
}
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
范围,因为它是一个免费的范围,为所有内容提供了权限)。
干杯。
在此处填写此内容以供后代参考:当使用文件选择器的drive.file权限时,仅当选择器托管在与Google开发者控制台Drive SDK配置页面中配置的同一域中时,您收到的url/令牌才会起作用(https://console.developers.google.com/apis/api/drive.googleapis.com/drive_sdk)。
如果您将其托管在任何其他域上,当您尝试使用 URL 直接下载文件时,您将收到 404:您需要使用drive.readonly 或驱动器权限。
我做了一些测试,发现“drive.file”范围实际上在获取文件元数据/内容方面存在一些问题。从文档中,“drive.file”允许应用程序访问由此应用程序创建的文件,或者用户使用此应用程序从驱动器或谷歌文档显式打开文件。当我测试这个时,实际上这并没有按预期工作。我上传了几个文件,其中一个文件可以由我的应用程序访问,但其他文件则不能。我记得当我发布我的应用程序时,Google Drive 团队审查了我的应用程序,并在范围内拒绝了几次,最终该应用程序仅通过了“drive.file”范围的审查。
有人遇到同样的问题吗?
正如文档所述
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中选择一个文件时,它在所有应用程序中都可用。
但事实并非如此。我使用简历模板创建了一个谷歌文档。我获取了 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/
在我请求更多权限后,问题解决了。一切都没有改变。
就我而言,它是关于设置
Drive.files().get(googleId).setSupportsAllDrives(true)
来访问共享驱动器上的文件。
我需要请求 /auth/drive.readonly 访问权限