从node.js报告上载进度

can*_*lin 9 amazon-s3 node.js formidable knox-amazon-s3-client

我正在编写一个小的node.js应用程序,它从HTML表单接收多部分POST并将传入的数据传递给Amazon S3.的强大的模块提供了多部分解析,露出各部分作为节点.该诺克斯模块处理PUT到S3.

var form = new formidable.IncomingForm()
 ,  s3   = knox.createClient(conf);

form.onPart = function(part) {
    var put = s3.putStream(part, filename, headers, handleResponse);
    put.on('progress', handleProgress);
};

form.parse(req);
Run Code Online (Sandbox Code Playgroud)

我通过socket.io向浏览器客户端报告上传进度,但是很难获得这些数字以反映节点上传到s3的真实进度.

当浏览器到节点上传瞬间发生时,就像节点进程在本地网络上运行时一样,进度指示器立即达到100%.如果文件很大,即300MB,则进度指示器缓慢上升,但仍然比我们的上游带宽允许的速度快.在达到100%进度后,客户端然后挂起,大概等待s3上传完成.

我知道在内部putStream使用Node的stream.pipe方法,但我不明白这是如何工作的细节.我的假设是节点尽可能快地吞噬输入数据,将其丢入内存.如果写入流可以足够快地获取数据,则很少有数据一次保存在存储器中,因为它可以被写入和丢弃.如果写入流速度很慢,就像在这里一样,我们可能必须将所有传入数据保留在内存中,直到可以写入为止.由于我们正在侦听data读取流上的事件以便取得进展,因此我们最终报告上传速度比实际速度快.

我对这个问题的理解是否接近标记?我该怎么办呢?我需要坐下来脏write,drainpause

num*_*407 8

你的问题是stream.pause没有实现part,这是一个非常简单的多部分表单解析器输出的读取流.

当部件发出"数据"时,Knox指示s3请求发出"进度"事件.但是,由于part流忽略暂停,因此会在上载和分析表单数据时尽快发出进度事件.

form然而,强大的,确实知道如何pauseresume(它代理对它正在解析的请求的调用).

这样的事情可以解决你的问题:

form.onPart = function(part) {

    // once pause is implemented, the part will be able to throttle the speed
    // of the incoming request
    part.pause = function() {
      form.pause();
    };

    // resume is the counterpart to pause, and will fire after the `put` emits
    // "drain", letting us know that it's ok to start emitting "data" again
    part.resume = function() {
      form.resume();
    };

    var put = s3.putStream(part, filename, headers, handleResponse);
    put.on('progress', handleProgress);
};
Run Code Online (Sandbox Code Playgroud)