上传进度 – 请求
我正在使用Request
上传文件。
req = request.post url: "http://foo.com", body: fileAsBuffer, (err, res, body) -> console.log "Uploaded!"
我如何知道实际上传了多less数据? 是否有一些我可以订阅的事件,或者是否有可以轮询的request
的属性?
如果没有,上传数据的最佳方法是什么,并知道上传了多less?
我需要处理另一个项目的上传进度。
我发现,你可以轮询request
的connection._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
。
我花了几个小时在request
和node
源中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.0
和request 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"); });