使用Google Drive API上传Excel文件失败,参照官方文档代码仍无法解决的问题求助
解决Google Drive API上传Excel文件失败的问题
我来帮你排查下这个上传失败的问题,看了你的代码后发现几个关键错误点,咱们一个个来修正:
1. 权限范围配置错误
你当前使用的权限是https://www.googleapis.com/auth/drive.metadata.readonly,这个权限仅允许读取Drive的元数据,完全没有上传文件的权限。必须替换成具备写入权限的范围:
- 推荐使用
https://www.googleapis.com/auth/drive.file:最小权限,仅对你的应用上传的文件有访问权,符合安全最佳实践 - 或者使用
https://www.googleapis.com/auth/drive:全权限,谨慎使用(仅限测试或完全信任的场景)
2. Excel文件读取方式错误
你用require()来加载Excel文件是完全错误的——require()是Node.js用来加载JS/JSON模块的方法,根本无法处理二进制格式的Excel文件。正确的做法是使用Node.js的fs模块创建可读流来读取文件内容。
修正后的完整代码示例
const fs = require('fs'); const path = require('path'); const { google } = require('googleapis'); @Get('teste') async teste(){ const keys = require(path.resolve('src', 'files', 'api', 'keys')) const client = new google.auth.JWT( keys.client_email, null, keys.private_key, // 替换为具备写入权限的范围 ['https://www.googleapis.com/auth/drive.file'] ) // 把回调转成Promise,适配async/await语法,避免嵌套回调 try { await client.authorize(); this.gdrun(client); } catch (err) { console.error('授权失败:', err); } } gdrun(client){ const drive = google.drive({version: 'v3', auth: client}); var fileMetadata = { name: 'My Report', mimeType: 'application/vnd.google-apps.spreadsheet' // 自动转换为Google表格格式 }; var media = { mimeType: 'application/vnd.ms-excel', // 使用fs创建可读流读取本地Excel文件 body: fs.createReadStream(path.resolve('src', 'files', 'excel', 'solargroup.xlsx')) }; drive.files.create({ resource: fileMetadata, media: media, fields: 'id' }, function (err, file: any) { if (err) { console.error('上传失败:', err); } else { console.log('文件上传成功,File Id:', file.id); } }); }
额外注意事项
- 如果要上传到指定的Drive文件夹,需要在
fileMetadata里添加parents: ['目标文件夹ID'],并且确保你的服务账号邮箱被添加到该文件夹的共享成员中(至少赋予编辑权限) - 确认
solargroup.xlsx文件的路径完全正确,避免因文件不存在导致的读取失败 - 如果转换为Google表格格式失败,可以尝试把
fileMetadata.mimeType改成application/vnd.openxmlformats-officedocument.spreadsheetml.sheet(对应xlsx格式),直接上传原文件而不做格式转换
内容的提问来源于stack exchange,提问作者Lucas Modolo
相关产品推荐
相关产品推荐

