相关文章
- P01: 从实用角度出发的node.js学习教程
- P02:node基本使用
- P03:node内置模块path
- P04:nodeAPI 之 Buffer
- P05:node内置模块 之 events
- P06:node内置模块 fs(1)
- P07:node内置模块 fs(2)
- P08:node实现静态服务器 ~ 创建项目
- P09:node实现静态服务器 ~ hello http
- P10:node实现静态服务器 ~ 静态读取文件或文件夹
- P11:node实现静态服务器 ~ 初步优化体验
- P12:node实现静态服务器 ~ Content-Type优化设置
- P13:node实现静态服务器 ~ Accept-Encoding与Content-Encoding
- P14:node实现静态服务器 ~ 范围请求range
向服务器发起请求除了可以一次要求把所有的内容拿回来,还可以申明我想请求判断内容的范围,从多少个字节到多少个字节,服务器在得到相应的请求之后,从拿到对应的文件,拿到对应的字节返回给客户端。(可以利用此项实现分段下载功能)
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