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