回答
我需要處理另一個項目的上傳進度。
我發現的是,你可以輪詢request
的connection._bytesDispatched
屬性。
例如:
r = request.post url: "http://foo.com", body: fileAsBuffer
setInterval (-> console.log "Uploaded: #{r.req.connection._bytesDispatched}"), 250
注意:如果你正用管道來r
,輪詢r.req.connection.socket._bytesDispatched
代替。
有人已經創建了一個很好的模塊來完成這項工作,該模塊已經在transloadit的生產堆棧中運行(所以它可靠且維護良好)。你可以在這裏找到它:
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的創建。在this video Ryan談到節點是如何開始試圖找到通知用戶的最佳方式,實時通過網絡上傳文件的狀態...無論如何我離題了,但如果你有興趣,視頻是值得一看的在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");
});
我花了幾個小時找到任何有效的request
和node
來源,終於找到了不同的方法,這感覺更正確的我。
我們可以依靠drain
事件和bytesWritten
屬性:
request.put({
url: 'https://example.org/api/upload',
body: fs.createReadStream(path)
}).on('drain',() => {
console.log(req.req.connection.bytesWritten);
});
另外,如果你需要處理的文件的字節進步,它更容易使用流data
事件:
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);
})
});
流緩衝區大小是65536
字節並且讀/排程序迭代運行。
這對我來說似乎很好,node v4.5.0
和request v2.74.0
。
排水方法爲我工作。然而,我不得不通過管道傳輸文件,而不是通過body參數傳遞它。當我通過body參數傳遞它時,它會多次耗盡,但它會快速連續執行,而不是在服務器實際接收數據時執行。看起來,通過身體傳遞它導致它被緩衝,這並沒有給出正確的體驗。乾杯。 – McP
var request = require('request');
var fs = require('fs');
let path ="C:/path/to/file";
var formData = {
vyapardb: fs.createReadStream(path)
};
let size = fs.lstatSync(path).size;
var headers = {
'Accept' : 'application/json',
'Authorization' : 'Bearer '+token,
};
var r = request.post({url:'http://35.12.13/file/upload', formData: formData, headers: headers}, function optionalCallback(err, httpResponse, body) {
clearInterval(q);
});
var q = setInterval(function() {
var dispatched = r.req.connection._bytesDispatched;
let percent = dispatched*100/size;
console.dir("Uploaded: " + percent + "%");
}, 250);
}
- 1. XHR進度條用於請求和響應的文件上傳
- 2. SOAP,獲取上傳的請求的進度,同時其上傳c#
- 3. TYPO3上傳進度
- 4. Crossbrowser上傳進度計(請不要SWFUpload)
- 5. HTTP上傳進度
- 6. CodeIgniter上傳進度
- 7. Flash上傳進度
- 8. 上傳進度條
- 9. Alamofire上傳進度
- 10. Plupload上傳進度速度
- 11. 請求確認後上傳
- 12. Phonegap上傳請求爲空
- 13. python請求上傳文件
- 14. 流媒體上傳請求?
- 15. MVC上傳進度條
- 16. Uploadify文件上傳和上傳進度
- 17. 文件上傳進度
- 18. AJAX請求後更新進度條
- 19. 服務器端HTTP POST請求進度
- 20. 前往:跟蹤POST請求進度
- 21. 顯示龍捲風請求的進度
- 22. 如何顯示Ajax請求進度
- 23. AJAX請求進度百分比日誌
- 24. http請求的進度條 - 黑莓
- 25. Google Drive API v3請求進度bug
- 26. JQuery與進度條多個請求
- 27. Mootools請求跟蹤進度輸出
- 28. HTTP PUT請求 - 進度條實施
- 29. 更新JQuery的進度與AJAX請求
- 30. 多個Ajax請求和進度條
非常好,謝謝! – darma
也在尋找這個。雖然它看起來像是一個內部API(預計在未來'nodejs'版本中將會發生變化),但它似乎是唯一的解決方案。 –
這是痛苦的;這是唯一可用的Node.js解決方案嗎?嚴重的是,爲什麼Node.js中的文件上傳到HTTP API的問題還沒有解決呢?! – Sukima