我想以zip文件的形式下载数据库中的所有文件。
如果我只想下载元素,我可以轻松设置其标题和内容类型,然后可以发送其缓冲区。
db.collection("resource").find({}).toArray(function(err, result) {
res.setHeader('Content-disposition', 'attachment; filename=' + result[0].name);
res.contentType(result[0].mimetype);
res.send(result[0].data.buffer);
}
现在我想创建一个文件夹,并将每个result
元素添加到此文件夹,然后发送它。
以下代码只返回第一个文件。这是理性的,因为我立即发送了缓冲区。
for(var i=0; i < result.length; i++){
res.setHeader('Content-disposition', 'attachment; filename=' + result[i].name);
res.send(result[i].data.buffer);
}
我考虑将它们添加到数组中。
for(var i=0; i < result.length; i++){
var obj = {name: result[i].name, buffer: result[i].data.buffer};
files.push(obj);
}
res.setHeader('Content-disposition', 'attachment; filename=' + "resource");
res.contentType('application/zip');
res.send(files);
这会向我返回一个文本文件resource
,其中包含name
和buffer
作为JSON格式。
即使我将contentType更新为application / zip,它也会返回text fomat。
如何创建此文件,添加到文件夹并将文件夹类型设置为zip?
答案 0 :(得分:1)
以下代码段是适用于我的代码的简化版本。我不得不删除我的包装器,以便更容易理解,这样可能会导致错误。
function bundleFilesToZip(fileUrls, next) {
// step 1) use node's fs library to copy the files u want
// to massively download into a new folder
//@TODO: HERE create a directory
// out of your fileUrls array at location: folderUri
// step 2) use the tarfs npm module to create a zip file out of that folder
var zipUri = folderUri+'.zip';
var stream = tarfs.pack(folderUri).pipe(fs.createWriteStream(zipUri));
stream.on('finish', function () {
next(null, zipUri);
});
stream.on('error', function (err) {
next(err);
});
}
// step 3) call the function u created with the files u wish to be downloaded
bundleFilesToZip(['file/uri/1', 'file/uri/2'], function(err, zipUri) {
res.setHeader('Content-disposition', 'attachment; filename=moustokoulouro');
// step 4) pipe a read stream from that zip to the response with
// node's fs library
fs.createReadStream(zipUri).pipe(res);
});
答案 1 :(得分:0)
首先,您应该使用官方Express API中的res.attachment([filename])
,(http://expressjs.com/en/api.html)
您也可以使用adm-zip
模块创建zip文件夹
(https://www.npmjs.com/package/adm-zip)