4

Вопрос по node.js, html, javascript – Node.js отправляет файл клиенту

Здравствуйте, я пытался отправить файл из node.js клиенту. Мой код работает, однако, когда клиент идет по указанному URL (/helloworld/hello.js/test), он передает файл. Доступ к нему из Google Chrome заставляет файл (.mp3) воспроизводиться в плеере.

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

    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);
});
2 ответа
13

Вам нужно установить некоторые флаги заголовка;res.writeHead(200, {

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

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

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

от Marat Arguinbaev

Это очень плохо для пользователяreadFileSync в обработчике запросов, поскольку Node.js является однопоточным. Так что если у вас есть два запроса на этот URL, второй будет ждать, пока первый завершит свою работу. На localhost вы можете не заметить, что что-то не так, но на рабочем сервере с 1000 запросов в секунду будут задержки. использованиеreadFile с обратным вызовом вместо

от Oleg

Спасибо @Zub за ваше предупреждение. Это был просто пример, но вы абсолютно правы. Итак, я обновил свой код, чтобы предотвратить случаи, которые вы описали

от Hüseyin BABAL

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

от Hüseyin BABAL
0

вам нужно поработать над частью заголовка

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

  });

то есть над частью размещения контента, только тогда она позволит вам получить данные. узнать больше оСодержание Содержание

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

от tamak

Похожие вопросы