2014-02-05 4 views
2

Привет, я пытаюсь отправить файл с node.js клиенту. Мой код работает, однако, когда клиент переходит к указанному URL-адресу (/helloworld/hello.js/test), он передает этот файл. Доступ к нему из google chrome делает файл (.mp3) воспроизведением в проигрывателе.Node.js отправить файл клиенту

Моя цель состоит в том, чтобы браузер пользователя загрузил файл и попросил клиента, где он хочет его сохранить, а не передавать его на веб-сайт.

http.createServer(function (req, res) { 
     switch(req.url) { 
     case '/helloworld/hello.js/test': 
     var filePath = path.join(__dirname, '/files/output.mp3'); 
     var stat = fileSystem.statSync(filePath); 
     res.writeHead(200, { 
     'Content-Type': 'audio/mpeg', 
       'Content-Length': stat.size 
     }); 

    var readStream = fileSystem.createReadStream(filePath); 
    // We replaced all the event handlers with a simple call to readStream.pipe() 
    readStream.on('open', function() { 
    // This just pipes the read stream to the response object (which goes to the client) 
    readStream.pipe(res); 
    }); 

    readStream.on('error', function(err) { 
     res.end(err); 
}); 

ответ

10

Вам необходимо установить некоторые флаги заголовков;

res.writeHead(200, { 
    'Content-Type': 'audio/mpeg', 
    'Content-Length': stat.size, 
    'Content-Disposition': 'attachment; filename=your_file_name' 
}); 

Для замены потоковой передачи с загрузкой;

var file = fs.readFile(filePath, 'binary'); 

res.setHeader('Content-Length', stat.size); 
res.setHeader('Content-Type', 'audio/mpeg'); 
res.setHeader('Content-Disposition', 'attachment; filename=your_file_name'); 
res.write(file, 'binary'); 
res.end(); 
+0

Спасибо, что это сработало, но теперь он загружает только 4 МБ файла, весь файл размером около 6 Мб. –

+0

Вы проверили содержимое файла? Все внутри? –

+4

Очень плохо пользователь 'readFileSync' в обработчике запросов, так как Node.js является однопоточным. Поэтому, если у вас есть два запроса на этот URL-адрес, второй будет ждать, пока первый не завершит его работу. На локальном хосте вы можете не заметить, что что-то не так, но на производственном сервере с 1000 запросами в секунду будут задержки. Используйте ['readFile'] (http://nodejs.org/api/fs.html#fs_fs_readfile_filename_options_callback) с обратным вызовом вместо – Curious

0
response.writeHead(200, { 
    'Content-Type': 'audio/mpeg', 
    modification-date="date_object", 
    'Content-Disposition: attachment; 
    filename=output.mp3' 

    }); 

вам нужно работ по вашей части заголовка т.е. ваш контент-Disposition части, только тогда это позволит вам получить данные из. Узнайте больше о content Disposition

+0

@MaratArguinbaev. Вы сделали какой-то прогресс в этом и заработали? Я знаю его старую нить, но я пытаюсь сделать что-то подобное. Другой вопрос: встали ли вы с NODE.js или, в конечном итоге, перешли на другую инфраструктуру/решение для веб-сайтов? Благодаря! – tamak

Смежные вопросы