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,drain和pause?
你的问题是stream.pause没有实现part,这是一个非常简单的多部分表单解析器输出的读取流.
当部件发出"数据"时,Knox指示s3请求发出"进度"事件.但是,由于part流忽略暂停,因此会在上载和分析表单数据时尽快发出进度事件.
form然而,强大的,确实知道如何pause和resume(它代理对它正在解析的请求的调用).
这样的事情可以解决你的问题:
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)
| 归档时间: |
|
| 查看次数: |
3287 次 |
| 最近记录: |