【问题标题】:Pipe file in write stream directly to client as download in node.js将写入流中的文件直接传输到客户端,作为 node.js 中的下载
【发布时间】:2018-12-01 16:02:40
【问题描述】:

所以我试图将一个文件用作起始模板,在流中添加数据(不更改原始文件),并将其提供给客户端而不在服务器上保存新文件(我是目前也在使用 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')

【问题讨论】:

    标签: node.js express download stream


    【解决方案1】:

    您不能从写入流进行管道传输,但您当然可以从转换/双工流进行管道传输。

    所以你可以这样做:

    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

    【讨论】:

    • 谢谢!以及如何处理该 app.post,我应该使用 res.sendFile 还是 res.download?
    • @Mick 认为您可以做与此人相同的事情:stackoverflow.com/a/18857838/2089675。所以基本上你不需要做任何事情,因为 res 将流式传输所有内容并在完成后关闭流。
    猜你喜欢
    • 2014-12-06
    • 2021-03-09
    • 2021-04-22
    • 2013-03-12
    • 2015-11-29
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多