簡體   English   中英

如何從 Node.JS 套接字流觸發瀏覽器下載?

[英]How to trigger browser download from Node.JS socket stream?

我的 node.js 應用程序通過var socket = net.createConnection(port, ip); 從另一台服務器下載文件。 建立連接后,服務器將文件作為數據發送。

然后我通過做來抓住它

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

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

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

我最初的目標是使用上述方法下載文件,同時將字節作為可下載文件提供給客戶端的瀏覽器。 例如:用戶點擊站點上的一個按鈕,觸發服務器端下載功能,用戶得到文件保存提示。 Node.JS 然后從遠程服務器下載文件,同時在瀏覽器客戶端將每個新字節提供給用戶。 這可能嗎? 我想它需要發送八位字節流的標頭來觸發瀏覽器 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?

您需要在 http 響應中設置content-disposition標頭:

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

RFC2183

看起來你可能想要這個:

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);
  });
});

我找到了解決方案! 通過執行 res.write(d) 我能夠將字節從另一個連接定向到用戶瀏覽器下載。

app.get('/download', function (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();
});


});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM