P14:node实现静态服务器 ~ 范围请求range

960 阅读2分钟

相关文章

向服务器发起请求除了可以一次要求把所有的内容拿回来,还可以申明我想请求判断内容的范围,从多少个字节到多少个字节,服务器在得到相应的请求之后,从拿到对应的文件,拿到对应的字节返回给客户端。(可以利用此项实现分段下载功能)

range

  • RequestHeaders请求头中添加一个range对象以及定义的范围,逗号分割请求多个范围,

    range:bytes = [ start ] - [ end ]
    
  • RequestHeaders请求头中设置Accept-Ranges,这里表示服务器可以处理的格式是什么

    Accept-Ranges:bytes
    
  • RequestHeaders请求头中设置Content-Range表示返回的格式,从哪里开始那里结束,总量是多少

    Content-Range:bytes start-end/total
    

具体实现

添加header/range.js

```
/**
 * @param totalSize 整体字节大小
 */
module.exports = (totalSize, req, res) => {
  const range = req.header['range']
  // 判断是否存在range
  if (!range) {
    return { code: 200 }
  }
  const sizes = range.match(/bytes=(\d*)-(\d*)/)
  const end = sizes[2] || totalSize - 1
  const start = sizes[1] || totalSize - end
  // 判断需要截取的end start 值是否正确
  if (start > end || start < 0 || end > totalSize) {
    return { code: 200 }
  }
  // 设置头部
  res.setHeader('Accept-Range', 'bytes')
  res.setHeader('Content-Range', `bytes ${start} - ${end} / ${totalSize} `)
  res.setHeader('Content-Length', end - start)
  // 可以处理的情况返回以下结果
  return {
    code: 206,
    start: parseInt(start),
    end: parseInt(end)
  }
}

```

引入并且使用range.js

查看效果前的准备工作 curl

curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。

效果

  • 执行curl -i http://127.0.0.1:6969/README.md

可以看到返回了文件的全量数据

  • 获取范围数据curl -r 0-6 -i http://127.0.0.1:6969/README.md

可以看到,我们截取的是0-6个字符,一共768个字符

截取到的字符是# node (空格算一个字符)

close