如何从Node.JS套接字流中触发浏览器下载?

时间:2014-01-06 22:48:57

标签: javascript node.js express

我的node.js应用程序通过var socket = net.createConnection(port, ip);连接以从另一台服务器下载文件。一旦建立连接,服务器就会将文件作为数据发送。

然后通过

抓住它
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?

3 个答案:

答案 0 :(得分:2)

您需要在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

答案 1 :(得分: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);
  });
});

答案 2 :(得分:0)

我找到了解决方案! 通过执行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();
});


});