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命令中发现
attributes
和file
是作为表单和文件发送的
- 而且,我认为
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 无效,我认为发生了错误。所以请注意这一点。
参考文献:
我已经问过 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命令中发现
attributes
和file
是作为表单和文件发送的 - 而且,我认为
attributes="{"name":"Contract.pdf", "parent":{"id":"11446498"}}"
可能应该是attributes="{\"name\":\"Contract.pdf\", \"parent\":{\"id\":\"11446498\"}}"
。
- 从curl命令中发现
当我看到你现在的脚本时,
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 无效,我认为发生了错误。所以请注意这一点。