调用Google Drive API上传文件遇404:输入文件夹ID却提示文件未找到
我来帮你梳理这个问题,你遇到的两个异常(simple upload后找不到文件、drive.files.create报404)其实大概率是同一类原因导致的,咱们一步步拆解:
首先看错误里的关键矛盾点
你控制台报错提示找不到的文件ID是1ZTCEjsqIH8NoB5xpo1AD32wBrV6bpsKI,但你代码里写的目标文件夹ID是0BwwA4oUTeiV1TGRPeTVjaWRDY1E——这说明实际执行时传入的文件夹ID可能和你预期的不一致。建议在函数开头加一行日志,确认运行时的folderId值:
console.log('Current target folder ID:', folderId);
排查是不是代码没更新、或者有其他逻辑覆盖了这个变量。
最常见的404原因:授权账号无文件夹访问权限
你用的是jwtClient(服务账号),这类账号有独立的Google Drive存储空间,默认无法访问你个人Drive里的文件夹。必须做以下操作:
- 找到你的服务账号邮箱(格式一般是
[项目ID]@[项目ID].iam.gserviceaccount.com,可以在Google Cloud Console的IAM页面查看); - 打开目标文件夹的Google Drive页面,点击「共享」,把服务账号邮箱添加进去,至少授予「编辑」权限;
- 等待几分钟让权限生效,再重新测试。
Google官方文档里的404说明也提到了:
404: File not found: {fileId} The user does not have read access to a file, or the file does not exist.
这里的"user"指的是你的服务账号,不是你本人。
关于simple upload后找不到文件的解释
如果simple upload返回成功但你在自己的Drive里看不到文件,那文件大概率是上传到了服务账号自己的Drive存储空间里,而不是你指定的文件夹。因为服务账号没有访问你个人文件夹的权限时,上传的文件会默认存在它自己的Drive中,你无法直接看到。解决了上面的权限问题后,这个现象也会消失。
代码层面的优化建议
除了权限问题,你可以调整代码的几个细节来避免潜在问题:
- 确保引入了
fs和path模块(你的代码里没看到引入,可能会导致读取文件失败):const fs = require('fs'); const path = require('path'); - 如果目标文件夹在共享驱动器(Shared Drive)中,需要在
drive.files.create的参数里加上supportsAllDrives: true:drive.files.create({ auth: jwtClient, resource: fileMetadata, media: media, fields: 'id', supportsAllDrives: true // 新增这个参数 }, function(err, file) { if (err) { console.error('Full error details:', err); return; } console.log('File Id: ', file.id); console.log("callback accomplished.") }); - 可以在回调里打印更详细的错误信息,方便排查深层问题。
补充验证步骤
- 用服务账号的邮箱登录Google Drive,看看是否能看到目标文件夹;
- 检查Google Cloud Console里的API是否启用:确保「Google Drive API」已经在「API和服务」>「已启用的API和服务」列表中;
- 确认授权范围:你初始化jwtClient时,请求的scope应该包含
https://www.googleapis.com/auth/drive或者https://www.googleapis.com/auth/drive.file,前者权限更全,适合测试阶段使用。
内容的提问来源于stack exchange,提问作者Diagathe Josué

