目前,我有很多基于Linux的客户端从我的网络服务器下载固件更新。
客户端成功下载固件文件后,我的服务器需要执行一些脚本,这些脚本会登录到客户端并执行一些任务。
节点服务器是否有办法跟踪客户端下载进度,因此我可以在下载文件后执行所需的脚本?
答案 0 :(得分:0)
好的,我会尝试。
如果您通过Apache / Nginx和直接网址调用将固件作为静态文件提供服务。您没有在NodeJS脚本中获得进展。
如果您通过快速控制器内的流提供文件,则可以听取进度。在这里查看这个答案https://stackoverflow.com/a/42273080/3168392
答案 1 :(得分:0)
您必须使用套接字连接以确保节点服务器从客户端获取正在下载的文件进度的更新。 像这样的东西
CLIENT_CODE
var socket = io('http://localhost');
socket.on('connect', function(){});
socket.on('data_reciving', parts.pop(),function(percentage){
if(parse_data(percentage) === 100){
client.socket.emit('downloadCompleted', {fileName:'test'});
}else{
//do nothing
}
});
SERVER_CODE:
sockets.on('connection', function (socket) {
//listen to the event from client
socket.on('downloadCompleted', function (data) {
connect_to_client();
do_some_operation();
socket.emit('ALLDONE',{some_data});
});
});
我想这有帮助,您可以使用this帖子作为参考。
答案 2 :(得分:0)
我找到了一些似乎符合我需求的代码。 使用下面的代码,我可以检测用户从服务器端下载的进度,并在文件传输完成后触发事件。
var http = require("http");
var fs = require("fs");
var filename = "./large-file";
var serv = http.createServer(function (req, res) {
var sent = 0;
var lastChunkSize = 0;
var stat = fs.statSync(filename);
res.setHeader('Content-disposition', 'attachment; filename=large-file.iso');
res.setHeader('Accept-Ranges', 'bytes');
res.setHeader('Keep-Alive', 'timeout=5, max=100');
res.writeHeader(200, {"Content-Length": stat.size});
var fReadStream = fs.createReadStream(filename, { highWaterMark: 128 * 1024 });
fReadStream.on('data', function (chunk) {
if(!res.write(chunk)){
fReadStream.pause();
lastChunkSize = chunk.length;
console.log('Sent', sent, 'of', stat.size);
}
});
fReadStream.on('end', function () {
console.log('Transfer complete.');
res.end();
});
res.on("drain", function () {
sent += lastChunkSize;
fReadStream.resume();
});
});
serv.listen(3001);
答案 3 :(得分:0)
如果只是想要在下载完成后运行一些代码,您可以使用on-finished
:
const onFinished = require('on-finished');
app.use((req, res, next) => {
onFinished(res, (err, res) => {
...log some data, perform some housekeeping, etc...
});
next();
});
按原样,它会将“已完成”的侦听器附加到所有响应,这可能不是您想要的。由于这是普通的Express中间件,因此您可以将其附加到特定路由(但具体取决于文件的准确程度)。