2014-01-06 60 views
1

我的node.js應用程序通過var socket = net.createConnection(port, ip);連接以從另一個服務器下載文件。一旦建立連接,服務器就會將該文件作爲數據發送。如何從Node.JS套接字流觸發瀏覽器下載?

我抓住它,然後做

socket.on('data', function(data) { 

}).on('connect', function() { 

}).on('end', function() { 
console.log('DONE'); 
}); 

我最初的目標是,到下載使用上面,並在同一時間的方法文件給字節到客戶端的瀏覽器作爲下載的文件。例如:用戶點擊站點上的一個按鈕,觸發服務器端下載功能,用戶獲得文件保存提示。然後Node.JS從遠程服務器下載文件,同時在瀏覽器客戶端爲用戶提供每個新字節。這可能嗎?我想它需要發送octet-stream的頭文件來觸發瀏覽器Node.JS之間的文件傳輸。但是如何?

更新

現在我想下面的代碼與下面的答案的幫助:

app.get('/download', function (req, res) { 

res.setHeader('Content-disposition', 'attachment; filename=' + "afile.txt"); 
res.setHeader('Content-Length', "12468") 

var socket = net.createConnection(1024, "localhost"); 
console.log('Socket created.'); 
socket.on('data', function(data) { 

    socket.pipe(res) 

}).on('connect', function() { 
// // Manually write an HTTP request. 
// socket.write("GET/HTTP/1.0\r\n\r\n"); 
}).on('end', function() { 
    console.log('DONE'); 
    socket.end(); 
}); 

}); 

的數據被髮送到用戶的瀏覽器作爲下載,但最終的結果是一個破碎的文件。我查看了內部的內容,並發現該過程中的某些內容導致文件損壞。 我想現在我必須寫每字節的字節?而不是做socket.pipe?

+1

你不能這樣做,但你可以使用套接字接收內存中的整個文件,然後讓用戶使用下載的文件一個數據URI。像這樣:http://stackoverflow.com/questions/3665115/create-a-file-in-memory-for-user-to-download-not-through-server。直接爲用戶流式傳輸文件下載但是不可能使用websockets – Kerstomaat

+0

文件下載只能通過http。該接口是不存在的websocket發送文件通過它尚未標準化。請參閱另一個類似的問題http://stackoverflow.com/questions/9871357 /通過websocket接收文件並啓動下載對話框。 – user568109

+0

你正在混合('data')和pipe。當你的第一塊數據丟失時你附上'.pipe' –

回答

2

你需要設置content-disposition頭在你的HTTP響應:

response.writeHead(200, { 
    'Content-Disposition': 'attachment; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"' 
    }); 
    yourDataStream.pipe(response); 

看到RFC2183

+0

該文件通過websocket發送。 – user568109

+0

爲什麼你不能通過http服務它? –

+0

你可以但這不是OP所要求的。 – user568109

2

看起來,你可能希望這樣的:

app.get('/download', function (req, res) { 
    res.attachment('afile.txt'); 
    require('http').get('http://localhost:1234/', function(response) { 
    response.pipe(res); 
    }).on('error', function(err) { 
    res.send(500, err.message); 
    }); 
}); 
0

我找到了解決辦法!通過做res.write(d) 我能夠將來自其他連接的字節指向用戶瀏覽器下載。 app.get(「/下載」,功能(REQ,RES){

res.setHeader('Content-disposition', 'attachment; filename=' + "afile.jpg"); 
res.setHeader('Content-Length', "383790"); 
res.setHeader('Content-Type','image/jpeg'); 

var socket = net.createConnection(1024, "localhost"); 
console.log('Socket created.'); 
//socket.setEncoding("utf8"); 
socket.on('data', function(d) { 
    console.log(d); 
    res.write(d); 
}).on('connect', function() { 
// // Manually write an HTTP request. 
// socket.write("GET/HTTP/1.0\r\n\r\n"); 
}).on('end', function() { 
    console.log('DONE'); 
    socket.end(); 
}); 


});