2016-06-01 2 views
1

я создаю модуль потоковой передачи, который будет течь любой файл на моем сервере пользователяnode.js поток диапазон заголовка не определен

для этого у меня есть следующий код узла:

.get(function (req, res) { 
     if (req.query.resourceToken) { 
     var decoded = jwt.decode(req.query.resourceToken, require('../secret')()); 
     var mediaObject = decoded.mediaObject; 
     var file = path.resolve(mediaObject.targetDir, mediaObject.file.originalname); 
     fs.stat(file, function (err, stats) { 
      if (err) { 
       if (err.code === 'ENOENT') { 
        // 404 Error if file not found 
        return res.sendStatus(404); 
       } 
       res.end(err); 
      } 
      var range = req.headers.range; 
      if (!range) { 
       // 416 Wrong range 
       return res.sendStatus(416); 
      } 
      var positions = range.replace(/bytes=/, "").split("-"); 
      var start = parseInt(positions[0], 10); 
      var total = stats.size; 
      var end = positions[1] ? parseInt(positions[1], 10) : total - 1; 
      var chunksize = (end - start) + 1; 
      res.writeHead(206, { 
       "Content-Range": "bytes " + start + "-" + end + "/" + total, 
       "Accept-Ranges": "bytes", 
       "Content-Length": chunksize, 
       "Content-Type": mediaObject.file.mimetype 
      }); 

      var stream = fs.createReadStream(file, {start: start, end: end}) 
       .on("open", function() { 
        stream.pipe(res); 
       }).on("error", function (err) { 
        res.end(err); 
       }); 
     }); 
    } 
    else { 
     res.status(500).send('Missing resource token!'); 
    } 
}); 

Теперь для загрузки простого документа я иметь последующий HTML тег:

<a target="_self" href="http://localhost:433/resource?resourceToken=token" class="btn btn-default">        <i class="fa fa-download"> </i></a> 

Теперь, когда я нажимаю на кнопку он правильно вызывает метод, однако headerrange не определено.

что означает, что он отправляет код ошибки 416 (как показано в приведенном выше коде).

Может ли кто-нибудь сказать мне, почему это происходит и что им не хватает?

+0

заголовок диапазона доступен только тогда, когда клиенты его отправляют, в основном, когда он передает поток (видео/аудиоплеер). Не когда он загружает его. Если он не попытается вернуться. –

ответ

1

Запросы диапазона служат для определенной цели (например, для частичной загрузки при очистке аудио/видео).

Ваш HTML предлагает вам просто указать ссылку для загрузки для определенного ресурса, и браузер не выдаст запрос диапазона для этого (или он может, но только после первоначального запроса).

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

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