【发布时间】:2018-04-05 17:09:06
【问题描述】:
如果您下载目录,Google Drive 网络界面允许您下载单个 .zip 文件。但是,我发现无法使用 API 做到这一点。是否可以使用 API 在驱动器上创建多文件 zip?
更新:Tanakie 的代码有效!这很棒!但是,我只能在我的个人帐户中使用它。我有两个 G-Suite 管理员帐户,但出现错误:
“抱歉,目前无法打开文件。
请检查地址,然后重试。"
我已经确认这在多个免费的个人 Google 帐户中运行良好。 知道为什么在使用付费谷歌帐户时它不起作用吗?
------- 更新 ------
如果您收到“抱歉,此时无法打开文件”错误,请等待一天,该错误会自行修复。
这是我仅使用 POST 的最终解决方案。就像田池在下面所说的那样。
谷歌脚本:
function doPost(e) {
var zipFileName = e.parameter.zipFileName
var fileIds = e.parameter.ids.split(",");
return ContentService.createTextOutput(zipping(fileIds, zipFileName));
}
function zipping(fileIds, zipfilename) {
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(fileID) {
try {
var file = DriveApp.getFileById(fileID);
var mime = file.getMimeType();
var name = file.getName();
} catch (er) {
return er
}
var blob;
if (mime == "application/vnd.google-apps.script") {
blob = UrlFetchApp.fetch("https://script.google.com/feeds/download/export?id=" + fileID + "&format=json", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
} else if (~mime.indexOf('google-apps')) {
mimeInf =
mime == "application/vnd.google-apps.spreadsheet" ? ["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name + ".xlsx"] : mime == "application/vnd.google-apps.document" ? ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", name + ".docx"] : mime == "application/vnd.google-apps.presentation" ? ["application/vnd.openxmlformats-officedocument.presentationml.presentation", name + ".pptx"] : ["application/pdf", name + ".pdf"];
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "/export?mimeType=" + mimeInf[0], {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(mimeInf[1]);
} else {
blob = UrlFetchApp.fetch("https://www.googleapis.com/drive/v3/files/" + fileID + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
var driveFolder = DriveApp.getFoldersByName("zipFiles").next();
return driveFolder.createFile(zip).getId();
}
调用它的php代码:
$url = 'https://script.google.com/a/domain.com/macros/s/### script id ####/exec';
$googleIDs = array();
foreach($documents AS $document){
$googleIDs[] = $document->google_file_id;
}
$data['zipFileName'] = date('c') . ".zip";
$data['ids'] = join(',', $googleIDs);
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-type: multipart/form-data" ));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result = curl_exec($ch); // This returns the Google file ID of the zip file.
curl_close($ch);
但是,正如我在下面的评论中一样,这是一个无用的、徒劳的练习,因为 Google 将脚本创建的文件限制为 10M。我要去寻找一个不依赖于 Google 的解决方案...希望我在开始之前就知道这一点。
【问题讨论】:
-
当心!!!我确实得到了这个工作。但是,由于 Google 将脚本创建的文件限制为 10M,因此几乎没有用处。
-
给您带来的不便,我深表歉意。我应该首先询问您使用的尺寸。我很抱歉。
-
我能问你一个文件的大小吗?如果小于 10MB,那么以 10MB 为单位创建 zip 文件怎么样?
-
一组文件很容易达到数百兆。有些更大。拆分成 10M 的文件是不切实际的。大多数单个文件都小于 10M,但在这种情况下,用户无需压缩即可下载该文件。我正在处理大量数据。
-
感谢您提供的信息。给您带来的不便,我深表歉意。
标签: google-apps-script web-applications google-drive-api drive