【问题标题】:NodeJS - Serve file with throttled speedNodeJS - 以节流速度提供文件
【发布时间】:2016-08-16 17:23:39
【问题描述】:

我对 NodeJS 很陌生,并尝试了不同的东西。

我能够做的是使用以下代码下载一个文件:

app.get('/download', function(req, res){


  var file = 'public/songs/myfile.mp3';

  var filename = path.basename(file);
  var mimetype = mime.lookup(file);

  res.setHeader('Content-disposition', 'attachment; filename=' + filename);
  res.setHeader('Content-type', mimetype);
  res.setHeader('Content-Length', file.length);

  var filestream = fs.createReadStream(file);

  filestream.pipe(res);
});

这很好用,现在我想要实现的是看看是否可以限制下载速度。就像有人尝试下载文件一样,它会以最大 1 Mbps 的速度下载(例如)。

我已尝试使用此代码:https://gist.github.com/4poc/1454516

当我加载页面时,它似乎加载不明确,但我认为问题是

filestream.pipe(limitStream);

因为没有给出任何回应。

如何实现我想做的事情?或者如何修复我尝试使用的代码?

【问题讨论】:

    标签: node.js pipe


    【解决方案1】:

    reqres 对象是流,因此您可以通过管道处理响应:

    var filestream = fs.createReadStream(file);
    
    filestream.pipe(limitStream).pipe(res);
    

    fwiw:每次调用 pipe() 时,都会返回一个新流。以上与此相同:

    var filestream = fs.createReadStream(file);
    
    var throttleStream = filestream.pipe(limitStream);
    
    throttleStream.pipe(res);
    

    理解这一点很重要,因为这样做很诱人,但它不会达到您的预期:

    var filestream = fs.createReadStream(file);
    
    filestream.pipe(limitStream);
    
    filestream.pipe(res);
    

    【讨论】:

    • 我试过“filestream.pipe(limitStream).pipe(res);”这对我来说很有意义。但不幸的是,当我加载页面时,我立即得到一个空文件。与此同时,我看到 NodeJs 日志打印信息,例如:“发出暂停,将恢复:8.13333333333344ms 发出恢复发出数据发出暂停,将恢复:1.3333333333332575ms 发出结束发出恢复”这是脚本工作
    • 嗯,当时似乎有些不对劲。如果您只是简单地执行filestream.pipe(res); - 您是否获得了预期的文件响应(未受到限制)?
    • 编辑:不,你是对的,我一定搞砸了……稍后再回答:)
    • 好的,它工作正常,我重新开始,问题解决了。我不知道我在哪里搞砸了。还有一个小问题,也许你可以帮助解决。我不得不删除标题 Content-lenght 因为我不知道如何使用“createReadStream”读取文件的大小。我如何读取文件大小以便设置标题? :) 干杯
    • 您使用fs.stat 获取该类型的信息。先运行 stat 然后创建读取流,设置响应头,并在油门和响应上管道。
    猜你喜欢
    • 2023-04-03
    • 2011-10-13
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 2020-09-25
    • 2014-01-09
    • 2014-11-23
    • 2013-01-01
    相关资源
    最近更新 更多