如何在仅使用drive.file授权域的情况下通过Drive API获取Drive中.dat文件的Blob
解决使用
drive.file权限获取.dat文件Blob的问题 我来帮你搞定这个问题!你遇到的核心问题在于对Drive API的文件内容获取方式理解有误,还有创建文件时的MIME类型设置有小问题,咱们一步步修正:
1. 为什么之前的方法不行?
export端点只支持Google Docs编辑器系列文件(文档、表格、幻灯片等),普通的二进制或文本文件(比如你的.dat)根本用不了,所以会抛出fileNotExportable错误。- 改成
get后没加alt=media参数,默认返回的是文件的元数据(比如文件名、ID这些),而不是文件内容,所以你拿到的是"Not found"(其实是元数据的错误提示,因为你直接把它当内容解析了)。
2. 正确的文件内容获取方法
使用Drive API的files/{fileId}端点,并加上alt=media参数来获取文件的原始内容。这是获取非Docs编辑器文件内容的标准方式,而且适配drive.file权限(只要文件是当前脚本创建的,就有权限访问)。
修改后的getBlob函数:
function getBlob(fileID) { // 注意:不需要format参数,直接获取原始内容 var url = "https://www.googleapis.com/drive/v3/files/" + fileID + "?alt=media"; var response = UrlFetchApp.fetch(url, { method: "get", headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()}, muteHttpExceptions: true }); // 先检查响应状态码,确保请求成功 if (response.getResponseCode() !== 200) { console.error("获取文件失败:" + response.getContentText()); return null; } var blob = response.getBlob(); // 可以手动指定MIME类型(如果需要) blob.setContentType("text/plain"); return blob; }
3. 修正创建文件的MIME类型
你创建文件时写的mimetype: "application/octet-stream .dat"是错误的,MIME类型不能带文件后缀,正确的写法应该是"application/octet-stream"或者直接用"text/plain"(因为你的文件实际是文本类型)。修正后的创建代码:
function createDatFile(folder, filename, contents) { var connectionsFile = { title: filename, mimetype: "text/plain", // 或者用"application/octet-stream",根据你的需求选择 parents: [{'id': folder.getId()}], }; var blobData = Utilities.newBlob(contents, "text/plain"); // 这里也明确指定MIME类型 var file = Drive.Files.insert(connectionsFile, blobData); return file; }
4. 额外注意事项
- 确保你的脚本已经启用了Drive API:在Apps Script编辑器中,点击
资源->高级Google服务,找到Drive API并启用它。 drive.file权限的限制:脚本只能访问自己创建的文件或者用户通过授权流程明确允许访问的文件,你的文件是脚本创建的,所以没问题,不需要额外授权。
这样修改后,你就能正常获取到.dat文件的Blob,同时保持最小的drive.file权限范围啦!
内容的提问来源于stack exchange,提问作者ApsSanj




