将写入流中的文件直接传输到客户端,并在node.js中下载

时间:2018-12-01 01:48:25

标签: node.js express download stream

因此,我尝试将一个文件用作起始模板,在流中向其中添加数据(不更改原始文件),然后将其提供给客户端,而不在服务器上保存新文件(我是当前也在使用express模块​​。

到目前为止,我将数据传递到发布请求中,并将其添加到流的末尾。不幸的是,当您通过管道将读取流传输到写入流时,必须指定输出文件和写入流的位置。有什么办法解决吗?可以将输出文件位置设置为相关端口吗?

这是我目前所拥有的(出现错误:无法管道传输,不可读):

app.post("/output_xml", function(req, res) {
    var data = validateJSON(req.body);
    stream_xml(data, res);
});

function stream_xml(data, res)
{
    var read_stream = fs.createReadStream(__dirname + '/Static/input_template.xml')
    var write_stream = fs.createWriteStream(__dirname + '/Static/output.xml') // trying to prevent saving a file to the server though
    read_stream.pipe(write_stream);

    read_stream.on('end', () => {
        write_stream.write(data);
        write_stream.write("\nAdding more stuff");
    });

    write_stream.pipe(res);
} 

我可以将write_stream行换成类似的东西吗?

var write_stream = fs.createWriteStream('http://localhost:3000/output_xml/output.xml')

1 个答案:

答案 0 :(得分:0)

您不能通过写入流进行管道传输,但是可以肯定地可以通过转换/双工流进行管道传输。

因此您可以执行以下操作:

const { Transform } = require('stream');

const custom_response = new Transform({
    transform(chunk, encoding, callback) {
        this.push(chunk, encoding);
        callback();
    },

    flush(callback) {
        this.push(data);
        this.push("\nAdding more stuff");
        callback();
    },
});

read_stream.pipe(custom_response).pipe(res);

stream.Transform的替代方法也可以是stream.PassThrough,它具有与Transform相同的参数,但是您只需要指定flush方法。

https://nodejs.org/api/stream.html#stream_implementing_a_transform_stream