使用 Drive api 获取驱动器文件的 blob

Get the blob of a drive file using Drive api

我使用下面的脚本来获取通过我的 Apps 脚本项目生成的 abc.dat 文件的 blob。使用云端硬盘服务,这很容易。 使用的 oauthScope 是 https://www.googleapis.com/auth/drive.readonly

function ReadData() {
  var files;

  var folders = DriveApp.getFoldersByName("Holder");
  if (folders.hasNext()) {
    var folder = folders.next();
    var files = folder.getFiles();

    while (files.hasNext()){
      file = files.next();
        if(file.getName()=='abc.dat'){
          var content = file.getBlob().getDataAsString();
          return content;
        }    
    }
  }
  return '';
}

为了缩小身份验证范围,现在我正在修改代码以完全删除 https://www.googleapis.com/auth/drive.readonly oauthScope 并仅使用https://www.googleapis.com/auth/drive.file oauthScope。

使用驱动器 api,我没有找到直接获取文件 blob 的方法。 我使用下面的脚本来获取 word 文档文件的 blob。但它不适用于错误为 fileNotExportable, Export only supports Docs Editors files, code 403

的 .dat 文件
function getBlob(fileID, format){

  var url = "https://www.googleapis.com/drive/v3/files/" + fileID + "/export?mimeType="+ format;

  var blob = UrlFetchApp.fetch(url, {
    method: "get",
    headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true
  }).getBlob();

  return blob;
}

找到这个 并尝试在 url 中将 export 更改为 get。返回的 blob.getDataAsString() 现在给出“未找到”。

我在创建 abc.dat 文件时使用的 mimeType 是 application/octet-stream .dat。但是查看生成的文件,它的mimeType是text/plain。所以我在 getBlob 函数中使用 'text/plain' 作为 'format' 参数的输入。

.dat 文件创建代码:

 var connectionsFile = {
      title: filename,
      mimetype: "application/octet-stream .dat",
      parents: [{'id':folder.getId()}],
    };
      var blobData = Utilities.newBlob(contents);
      file = Drive.Files.insert(connectionsFile,blobData);
  }

如何修改此代码以从文件中获取 blob?还是有其他解决办法?

提前致谢!

我认为在你的情况下,需要使用get方法而不是export方法。因为 export 方法用于 Google 文档文件(文档、电子表格、幻灯片等)。当你的脚本修改后,下面的修改怎么样?

修改后的脚本:

function getBlob(fileID) {
  var url = "https://www.googleapis.com/drive/v3/files/" + fileID + "?alt=media";
  var blob = UrlFetchApp.fetch(url, {
    method: "get",
    headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
    muteHttpExceptions: true
  }).getBlob();
  return blob;
}

参考: