如果您下载了目录,Google 云端硬盘网络界面允许您下载单个.zip文件。但是,我发现没有办法使用API做到这一点。是否可以使用 API 在驱动器上创建多文件 zip?
更新:田木的代码有效!这太棒了!但是,我只能在我的个人帐户中使用它。我有两个 G Suite 管理员帐号,但出现以下错误消息:
“抱歉,此时无法打开文件。
请检查地址,然后重试。”
我已经确认这可以在多个免费的个人google帐户中正常工作。知道为什么在使用付费google帐户时它不起作用吗?
------- 更新 ------
如果您收到“抱歉,此时无法打开文件”错误,请等待一天,该错误将自行修复。
这是我的最终解决方案,只有一个帖子。就像塔奈克在下面说的。
谷歌脚本:
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);
然而,正如我在下面的评论中所说,这是一个无用的、徒劳的练习,因为谷歌将脚本创建的文件限制为10万。我要去寻找一个不依赖谷歌的解决方案…我希望在开始之前就知道这一点。
这个解决方法怎么样?
不幸的是,Google API中没有直接从外部创建zip文件的API。但我认为有一个解决办法。Google应用程序脚本(GAS)中有<code>zip()
如果这对你没有用,我很抱歉。
下面的示例脚本怎么样?这是一个简单的示例脚本,用于为文件夹中的文件创建zip文件。
这些对于web界面来说是一样的。
请执行以下流程。
function doGet(e) {
var files = DriveApp.getFolderById(e.parameter.folderid).getFiles();
var fileIds = [];
while (files.hasNext()) {
fileIds.push(files.next().getId());
}
return ContentService.createTextOutput(zipping(fileIds));
}
function zipping(fileIds) {
var zipfilename = "sample.zip";
var blobs = [];
var mimeInf = [];
var accesstoken = ScriptApp.getOAuthToken();
fileIds.forEach(function(e) {
try {
var file = DriveApp.getFileById(e);
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=" + e + "&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/" + e + "/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/" + e + "?alt=media", {
method: "GET",
headers: {"Authorization": "Bearer " + accesstoken},
muteHttpExceptions: true
}).getBlob().setName(name);
}
blobs.push(blob);
});
var zip = Utilities.zip(blobs, zipfilename);
return DriveApp.createFile(zip).getId();
}
curl -L "https://script.google.com/macros/s/#####/exec?folderid=### folder ID ###"
如果这对你有用,我很高兴。
问题内容: 我正在尝试使用Swift(不是Xcode项目)编写脚本。需要明确的是,我文件的第一行是 我只是从命令行调用它。 但是,我无法弄清楚该脚本如何使用另一个.swift文件中的代码。它不会从同一目录中拾取它,而且我看不到任何方法。 支持吗? 问题答案: 有更好的方法! 如果您要从中导入文件,将像:
问题内容: 我需要创建一个Zip文件,该文件由位于我的s3存储桶中的一系列文件(视频和图像)组成。 目前使用以下代码的问题是,我很快达到了Lambda的内存限制。 使用Lambda是否有可能,还是我应该采用其他方法? 是否可以即时写入压缩的zip文件,从而在某种程度上消除内存问题,还是我需要在压缩之前收集文件? 任何帮助将非常感激。 问题答案: 好的,我今天必须这样做,并且可以正常工作。直接缓冲区
我使用new File()在内存中创建一个文件,然后我想在上面写,但不想在磁盘中创建文件。 我希望它不要在磁盘上创建文件。
问题内容: 我正在尝试创建多个图像文件的zip文件。我已经成功创建了所有图像的zip文件,但是不知何故,所有图像都被挂起了950字节。我不知道这里出了什么问题,现在我无法打开将图像压缩到该zip文件中。 这是我的代码。谁能告诉我这是怎么回事? 问题答案: 更改此: 对此: 并将缓冲区大小设置为1024字节:
问题内容: 我有一个动态文本文件,可以根据用户的查询从数据库中选择内容。我必须将此内容写入文本文件,并将其压缩在servlet的文件夹中。我应该怎么做? 问题答案: 看这个例子: 这将在D:named 的根目录中创建一个文件,其中将包含一个名为的单个文件。当然,你可以添加更多的zip条目,还可以指定一个子目录,如下所示:
问题内容: 我喜欢新的Java8 StreamAPI,并希望不仅将其用于一个文件。通常,我使用以下代码: 但是,如果可能的话,如何在一个流中读取两个文件呢? 问题答案: 没有任何额外的帮助程序功能或外部库,最简单的方法是: 如果尚未声明抛出受检查的异常,则可以 但是,a,我们不能这样做。有几种解决方法。一种是制作自己的版本,将其称为标准版本,然后将其作为捕获并重新抛出。另一种方法是使用抛出检查异常