如何管道WriteStream连接扩展?

时间:2017-07-02 13:25:46

标签: node.js express node-archiver

我是NodeJS的新手。我知道我们可以使用pipe()方法将数据流传输到客户端。

以下是代码的片段

 router.get('/archive/*', function (req, res) {

        var decodedURI = decodeURI(req.url);
        var dirarr = decodedURI.split('/');
        var dirpath = path.join(dir, dirarr.slice(2).join("/"));
        console.log("dirpath: " + dirpath);
        var archive = archiver('zip', {
            zlib: {level: 9} // Sets the compression level.
        });
        archive.directory(dirpath, 'new-subdir');
        archive.on('error', function (err) {
            throw err;
        });
        archive.pipe(res)
        archive.on('finish', function () {
            console.log("finished zipping");
        });
        archive.finalize();

    });

当我使用get请求时,下载了压缩文件,但没有任何扩展名。我知道它,因为我正在将一个写入流传输到响应中。无论如何管道扩展名为.zip吗?或者如何在不在HDD中构建zip文件的情况下发送zip文件?

2 个答案:

答案 0 :(得分:1)

您可以使用res.attachment()来设置下载文件名,还可以设置其mime类型:

router.get('/archive/*', function (req, res) {
  res.attachment('archive.zip');
  ...
});

答案 1 :(得分:1)

其中一种方法是在滚动之前更改标题,

res.setHeader("Content-Type", "application/zip");
res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip');

对于给定代码,

router.get('/archive/*', function (req, res) {
        var decodedURI = decodeURI(req.url);
        var dirarr = decodedURI.split('/');
        var dirpath = path.join(dir, dirarr.slice(2).join("/"));
        var output = fs.createWriteStream(__dirname + '/7.zip');
        var archive = archiver('zip', {
            zlib: {level: 9} // Sets the compression level.
        });
        archive.directory(dirpath, 'new-subdir');
        archive.on('error', function (err) {
            throw err;
        });
        res.setHeader("Content-Type", "application/zip");
        res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip');
        archive.pipe(res);
        archive.finalize();

    });