2014-01-06 3 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 загружает файл с удаленного сервера и в то же время предоставляет каждому новому байту пользователю клиентский браузер. Это возможно? Я предполагаю, что для отправки файлов между браузером Node.JS необходимо отправить заголовки октетного потока. Но как?

Update

Теперь я попытался код ниже с помощью ответа ниже:

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. Потоковая передача файла непосредственно пользователю – Kerstomaat

+0

Загрузка файла разрешена только через http. Этот интерфейс не существует для websocket, так как отправка файла по нему еще не стандартизирована. См. другой аналогичный вопрос http://stackoverflow.com/questions/9871357/receive-file-via-websocket-and-initiate-download-dialog. – user568109

+0

Вы смешиваете («данные») и канал. Ваш первый фрагмент данных теряется, когда вы прикрепляете '.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

Вы можете, но это не то, о чем просит ОП. – 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.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(); 
}); 


}); 
Смежные вопросы