2016-06-01 63 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頭不存在。