BOX API by Google Apps Script - 新文件版本上传

BOX API by Google Apps Script - new file version upload

我已经问过 GAS 社区,但有人建议我继续在这里问... 到目前为止,我能够连接到 BOX 并获取文件列表,我也可以从 BOX 下载文件。 整个想法是使用 BOX API 下载文件,编辑它并使用 BOX API 将其作为新文件版本上传回来。 我无法使最后一部分工作,因为它给我错误代码 400。 这是函数。

function uploadNewFileVersion() {
  //767694355309 testing
  var boxFileId="767694355309";
  var newVerFile = DriveApp.getFileById("1sK-jcaJoD0WaAcixKtlHA85pf6t8M61v").getBlob();
  var confirmAuthorization = getBoxService_().getAccessToken();

  //var parent = { "id": "0" };

//"name": "apiNewVersion.xlsx",
//"parent": parent,  
  var payload = {
    "file": newVerFile
  }
  var headers = {
    'Authorization': 'Bearer ' + confirmAuthorization
  }
  var options = {
    "method": "post",
    "muteHttpExceptions": true,
    "contentType": "multipart/form-data",
    "headers": headers,
    "payload": payload
  }

  var apiHtml = "https://upload.box.com/api/2.0/files/"+boxFileId+"/content/";
  var response = UrlFetchApp.fetch(apiHtml, options);
  Logger.log(response.getResponseCode());
  var a = 1;
}

boxFileId 是盒子上的文件。 newVerFile 是从 Box 下载并更新的。我需要把它做成新版本的Box文件。

能请教一下吗? 谢谢! PEtr

我认为 parent 和名称是可选的,所以我将其注释掉了。 如果我不 getBlob,那么它 returns 415 isstead.

我相信你的目标和情况如下。

  • 您想使用 Box API 和 Google Apps 脚本上传 Google 驱动器的文件。
  • 根据你的问题,我找不到你要使用的API方法的官方文档。但是,根据脚本中的端点 https://upload.box.com/api/2.0/files/"+boxFileId+"/content/,我猜想您想使用 "Upload file version".
  • 您的访问令牌和文件 ID 的值对于使用 API 是有效的。

如果我对你问题的理解是正确的,下面的修改怎么样?

修改点:

  • 看到"Upload file version"的官方文档时,确认了下面的sample curl。在这种情况下,认为当以下 curl 命令转换为 Google Apps 脚本时,请求可能会起作用。

      $ curl -i -X POST "https://upload.box.com/api/2.0/files/12345/content" \
           -H "Authorization: Bearer <ACCESS_TOKEN>" \
           -H "Content-Type: multipart/form-data" \
           -F attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}" \
           -F file=@<FILE_NAME>
    
    • 从curl命令中发现attributesfile是作为表单和文件发送的
    • 而且,我认为 attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}" 可能应该是 attributes="{\"name\":\"Contract.pdf\", \"parent\":{\"id\":\"11446498\"}}"
  • 当我看到你现在的脚本时,multipart/form-data似乎用于contentType。在这种情况下,要求包含请求body中的boundary。幸运的是,在 UrlFetchApp 中,在 multipart/form-data 的情况下,当 contentType 未被使用时,内容类型会自动包含在请求中 header。我觉得在你的情况下,这个是可以用的。

  • 在您的脚本中,attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}" 未包含在内。但我认为您可能会在未来的脚本中使用它。所以在这个回答中,也包括了这个。

反映以上几点,将官方文档中的示例curl命令转换为Google Apps Script,脚本如下

示例脚本:

请将以下脚本复制粘贴到脚本编辑器中并设置变量,运行实现myFunction的功能。这样,使用 Google Apps 脚本请求与示例 curl 相同的请求。

function myFunction() {
  const accessToken = "###"; // Please set your access token.
  const fileId = "###"; // Please set your fileId.
  const fileBlob = DriveApp.getFileById("1sK-jcaJoD0WaAcixKtlHA85pf6t8M61v").getBlob();
  const metadata = {name: "Contract.pdf", parent: {id: "11446498"}};  // Please set your file metadata.

  const params = {
    method: "post",
    headers: {Authorization: `Bearer ${accessToken}`},
    payload: {
      attributes: JSON.stringify(metadata),
      file: fileBlob,
    },
    muteHttpExceptions: true,
  };
  const url = `https://upload.box.com/api/2.0/files/${fileId}/content`;
  const res = UrlFetchApp.fetch(url, params);
  console.log(res.getContentText());
}
  • 我可以确认上面的示例脚本与上面的示例 curl 是同一个请求。
  • 如果您不想使用文件元数据,请从 payload 中删除 attributes: JSON.stringify(metadata), 行。

注:

  • 在这种情况下,UrlFetchApp 的最大数据大小(“URL Fetch POST 大小”)为 50 MB。请注意这一点。 Ref
  • 关于BoxAPI的文件上传限制,请查看https://developer.box.com/guides/uploads/
  • 如果您的访问令牌和文件 ID 无效,我认为发生了错误。所以请注意这一点。

参考文献: