在多部分文件上传后,从node.js流式传输归档流

时间:2018-06-17 19:00:31

标签: node.js asp.net-core

我目前正在开发一个带有Electron前端和ASP.NET Core后端的应用程序。 Electron应用程序需要将一系列文件压缩到存档中,然后将zip文件上传到后端。我正在使用archiver创建一个zip存档。我可以通过将存档输出到文件,然后打开文件的读取流并进行上传来完成我的需要。

我的目标是避免将此文件临时写入文件系统并直接上传流。我可能完全不在这里,但这是我现有的代码:

const archiver = require('archiver');
const str = require('stream');
const request = require('request');

// . . .

const archive = archiver('zip', {
    zlib: { level: 1 } // Set the compression level.
});

// . . . Add files to archive

archive.finalize();

request.post(/* upload url */, {
    formData: {
        // Set additional form properties
        file: {
            options: {
                fileName: "test.zip"
            },
            value: archive
        }
    }
}, function(err, res, body) {
    // Handle response
});

我按预期收到请求,但在读取~50个字节后,asp抛出System.IO.IOException: Unexpected end of Stream

处理此流的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

事实证明,答案很简单。我的代码在两端都有效,但是,我的流长度未知,因此需要标头Transfer-Encoding: chunked才能向ASP.NET表明该流的长度未知。只需将此标头添加到请求即可解决问题:

request.post(/* upload url */, {
    headers: {
        "Transfer-Encoding": "chunked" // This is all that was needed.
    },
    formData: {
        // Set additional form properties
        file: {
            options: {
                fileName: "test.zip"
            },
            value: archive
        }
    }
}, function(err, res, body) {
    // Handle response
});