2017-03-02 50 views
0

目前,我有很多基於Linux的客戶端從我的網絡服務器下載固件更新。查看客戶端從服務器下載進度

客戶端成功下載固件文件後,我的服務器需要執行幾個腳本,它們登錄到客戶端並執行一些任務。

有節點服務器跟蹤客戶端下載進度的方法,所以我可以在文件下載後執行所需的腳本嗎?

+0

一些代碼片斷會很棒!他們如何下載文件?你的控制器是什麼樣的?沒有任何代碼,沒有人能正確回答這個問題。 – riXon

+0

客戶端通過HTTP下載固件文件。我不明白爲什麼代碼片段會是詭祕的。我只是問是否有節點服務器查看仍在發送的活動客戶端請求的方法,以及可能的下載進度。 – Drejer

+0

@Drejer在下載結束時執行一些代碼,查看下載進度以及查看所有活動下載之間存在差異。第一種方法可以很容易地實現,但這取決於你如何提供文件(靜態中間件,'res.sendFile()','res.download()',...)。因此,「代碼片段」。 – robertklep

回答

0

好吧,我會嘗試。

如果通過Apache/Nginx和直接調用URL來將固件作爲靜態文件提供。你不會在NodeJS腳本中獲得進展。

如果你通過流內的快遞控制器提供你的文件,你可以聽取進度。在這裏看看這個答案https://stackoverflow.com/a/42273080/3168392

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後以供參考。

+0

感謝您的建議。客戶端正在使用curl下載文件,不幸的是我無法改變這一點。 我想我一直希望有一些Express中間件可以拋出一些事件,一旦從服務器使用HTTP完全下載文件。 – Drejer

+0

你將不得不使用某種連接庫來從服務器拋出或發佈事件....或者可能有一個輪詢來檢查服務器 – damitj07

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); 
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中間件,因此您可以將其附加到特定的路由上(但具體取決於文件的服務方式)。