获取需要范围标头的错误我该如何修复它?

问题描述 投票:0回答:1

这是我的代码,它将正确传输,但是当尝试下载它时,会返回 Requires Range 标头的错误。

app.get('/download-file', (req, res) => {
  const filePath = req.query.file;

  if (!filePath) {
    res.status(400).send('File path is required');
    return;
  }
  const fullPath = path.resolve(filePath);
  fs.stat(fullPath, (err, stats) => {
    if (err) {
      res.status(404).send('File not found');
      return;
    }
    const fileSize = stats.size;
    const rangeHeader = req.headers.range;
    console.log(rangeHeader)

    if (!rangeHeader) {
      res.status(400).send('Requires Range header');
      return;
    }
    const ranges = rangeParser(fileSize, rangeHeader);
    if (ranges === -1) {
      res.status(416).send('Range not satisfiable');
      return;
    }
    if (ranges === -2 || !ranges.length) {
      res.status(400).send('Malformed Range header');
      return;
    }
    const range = ranges[0];
    const { start, end } = range;
    res.status(206);
    res.setHeader('Content-Range', `bytes ${start}-${end}/${fileSize}`);
    res.setHeader('Accept-Ranges', 'bytes');
    res.setHeader('Content-Length', end - start + 1);
    res.setHeader('Content-Type', 'application/octet-stream');
    res.setHeader('Content-Disposition', `attachment; filename="${path.basename(filePath)}"`);
    const stream = fs.createReadStream(fullPath, { start, end });
    stream.pipe(res);
    req.on('close', () => {
      stream.destroy();
      console.log('Request canceled by the client');
    });
  });
});

我尝试下载文件

http://192.168.1.3:3000/download-file?file=downloads/1716537967084_out.mkv
像这样但是它在vlc上正确传输但在尝试下载时不下载它返回需要范围标头的错误。

node.js express download
1个回答
0
投票

客户端不需要发送范围标头。 VLC 和其他流媒体客户端更有可能将其用于缓冲目的并加速点播放,但其他客户端(例如浏览器)默认情况下不会发送它(它通常仅用于恢复之前暂停的下载) 。您不应期望请求中包含范围标头;如果不可用,您必须从第一个字节到最后一个字节发送整个文件,而不返回任何错误代码。

© www.soinside.com 2019 - 2024. All rights reserved.