приложение 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?
Вы не можете сделать это, но вы можете получить весь файл в памяти с помощью сокетов, а затем заставить пользователя загрузить файл с помощью URI данных. Например: http://stackoverflow.com/questions/3665115/create-a-file-in-memory-for-user-to-download-not-through-server. Потоковая передача файла непосредственно пользователю – Kerstomaat
Загрузка файла разрешена только через http. Этот интерфейс не существует для websocket, так как отправка файла по нему еще не стандартизирована. См. другой аналогичный вопрос http://stackoverflow.com/questions/9871357/receive-file-via-websocket-and-initiate-download-dialog. – user568109
Вы смешиваете («данные») и канал. Ваш первый фрагмент данных теряется, когда вы прикрепляете '.pipe' –