【问题标题】:Streaming a zip file from node api to angular将 zip 文件从节点 api 流式传输到 angular
【发布时间】:2018-01-30 06:18:12
【问题描述】:

使用归档器在节点 api 中压缩文件并将 zip 流式传输到 Angular 前端。文件下载但没有打开解压缩时没有这样的文件或目录。我觉得 zip 不完整或没有以某种方式正确转换。此外,控制台日志消息永远不会在 finalize 回调中触发。有什么建议吗?

服务文件

function downloadDisclosuresZip(tid, files) {

        return $http.post('api/disclosures/download/' + tid, files, {
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'application/octet-stream',
                'responseType': 'arraybuffer'
            }
        }).then(function (response) {
            var filename = "disclosures.zip";
            console.log(response);
            openSaveAsDialog(filename, response.data, 'application/zip');
        });

    }

    function openSaveAsDialog(filename, content, mediaType) {
        var blob = new Blob([content], {
            type: mediaType
        });
        saveAs(blob, filename);
    }          

API(节点)

.post(function (req, res) {
        var tid = req.params.tid;
        console.log(req.body);
        var files = req.body;

        console.log('tid:' + tid);
        console.log('files:' + JSON.stringify(files));

        var archive = archiver('zip', {
            zlib: {
                level: 9
            } // Sets the compression level.
        });

        res.set('Content-Type', 'application/octet-stream');
        res.set('Content-Disposition', 'attachment; disclosures.zip');


        archive.on('warning', function (err) {
            if (err.code === 'ENOENT') {
                // log warning
                console.log(err);
            } else {
                // throw error
                console.log(err);
                throw err;
            }
        });

        archive.on('end', function (err) {
            console.log("achive ended");

        });

        archive.on('finish', function (err) {
            console.log("achive finished");

        });

        archive.on('close', function (err) {
            console.log("achive closed");

        });

        // good practice to catch this error explicitly
        archive.on('error', function (err) {
            console.log(err);
            throw err;
        });

        archive.pipe(res);

        archive.append('string cheese!', {
            name: 'file2.txt'
        });


        archive.finalize(function (err, bytes) {
            if (err) {
                console.log(err);
                throw err;
            }

            console.log('Disclosures Zip Created: ', bytes);
        });
});

【问题讨论】:

  • 您是否尝试过将存档也保存在节点端,如果它是服务器端问题或客户端/服务器之间的问题,将有助于缩小范围。 var output = fs.createWriteStream(__dirname + '/example.zip');npmjs.com/package/archiver
  • 如果我设置 var output = fs.createWriteStream(__dirname + '/example.zip');并将存档传输到那里,它按预期工作。我想管道响应是问题所在。

标签: angularjs node.js zip


【解决方案1】:

你可以通过这个来解决这个问题

var writeStream = fs.createWriteStream(filePath);
req.on('data',(data)=>{
     writeStream.write(data, 'binary' );
})

使用正确的编码写入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2018-02-06
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2015-11-28
    • 2016-01-21
    • 2018-12-16
    相关资源
    最近更新 更多