上传进度 – 请求

我正在使用Request上传文件。

 req = request.post url: "http://foo.com", body: fileAsBuffer, (err, res, body) -> console.log "Uploaded!" 

我如何知道实际上传了多less数据? 是否有一些我可以订阅的事件,或者是否有可以轮询的request的属性?

如果没有,上传数据的最佳方法是什么,并知道上传了多less?

我需要处理另一个项目的上传进度。

我发现,你可以轮询requestconnection._bytesDispatched属性。

例如:

 r = request.post url: "http://foo.com", body: fileAsBuffer setInterval (-> console.log "Uploaded: #{r.req.connection._bytesDispatched}"), 250 

注意 :如果你pipe道到r ,轮询r.req.connection.socket._bytesDispatched

我花了几个小时在requestnode源中find任何有效的东西,最后find了一个不同的方法,这对我来说更为正确。

我们可以依赖drain事件和bytesWritten属性:

 request.put({ url: 'https://example.org/api/upload', body: fs.createReadStream(path) }).on('drain', () => { console.log(req.req.connection.bytesWritten); }); 

或者,如果您需要处理文件字节的进度,那么使用streamdata事件更容易:

 let size = fs.lstatSync(path).size; let bytes = 0; request.put({ url: 'https://example.org/api/upload', body: fs.createReadStream(path).on('data', (chunk) => { console.log(bytes += chunk.length, size); }) }); 

数据stream缓冲区大小为65536字节,读/写过程迭代运行。

对于我来说,使用node v4.5.0request v2.74.0这似乎工作得很好。

有人已经创build了一个很好的模块来完成这个已经运行在transloadit的生产栈(所以它是可靠的和良好的维护)。 你可以在这里find它:

https://github.com/felixge/node-formidable

代码应该如下所示:

 var formidable = require('formidable'), http = require('http'), util = require('util'); http.createServer(function(req, res) { if (req.url == '/upload' && req.method.toLowerCase() == 'post') { // parse a file upload var form = new formidable.IncomingForm(); form.parse(req, function(err, fields, files) { res.writeHead(200, {'content-type': 'text/plain'}); res.write('received upload:\n\n'); res.end(util.inspect({fields: fields, files: files})); }); return; } // show a file upload form res.writeHead(200, {'content-type': 'text/html'}); res.end( '<form action="/upload" enctype="multipart/form-data" method="post">'+ '<input type="text" name="title"><br>'+ '<input type="file" name="upload" multiple="multiple"><br>'+ '<input type="submit" value="Upload">'+ '</form>' ); }).listen(80); 

然后,您可以使用Socket.io将状态推送到客户端

有趣的提示:这是导致Node创build的问题之一。 在这个video Ryan谈到如何开始试图find通知用户,实时,通过networking上传文件的状态的最佳方式…无论如何,我离题了,但video值得一看,如果你是对Node的历史感兴趣

尝试这种方法:

 var file = fs.createWriteStream("largefile.jpg"); var totalbytes = request.headers['content-length']; var donesofar = 0; request.pipe(file); request.on('data', function(chunk){ donesofar += chunk.length; var progress = (donesofar / totalbytes) * 100; response.write(parseInt(progress, 10) + "%\n"); });