动态创建多个文件nodejs

时间:2016-04-13 08:57:32

标签: node.js mongodb

我想以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,其中包含namebuffer作为JSON格式。

即使我将contentType更新为application / zip,它也会返回text fomat。

如何创建此文件,添加到文件夹并将文件夹类型设置为zip?

2 个答案:

答案 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