NodeJs之大文件断点下载
由于没啥复杂的,这里直接上代码。 http断点下载是通过range来判断文件的起始位置的。其基本原理就是,在文件的下载断开以后。客户端继续向服务器端请求的时候,http请求的头文件中会多了一个参数“Range”,来标示当前下载的文件所断开的位置。
const express = require('express');
const fs = require('fs');
let app = express();
app.get('/', (req, res, next) => {
let range = req.headers["range"];
// 下载文件路径
let p = 'workspace.rar';
// 存在 range 请求头将返回范围请求的数据
if (range) {
// 获取范围请求的开始和结束位置
let [, start, end] = range.match(/(\d*)-(\d*)/);
// 错误处理
let statObj = null;
try {
statObj = fs.statSync(p);
} catch (e) {
res.end("Not Found");
}
// 文件总字节数
let total = statObj.size;
// 处理请求头中范围参数不传的问题
start = start ? parseInt(start) : 0;
end = end ? parseInt(end) : total - 1;
// 响应客户端
res.statusCode = 206;
res.setHeader("Accept-Ranges", "bytes");
res.setHeader("Content-Range", `bytes ${start}-${end}/${total}`);
fs.createReadStream(p, {
start,
end
}).pipe(res);
} else {
// 没有 range 请求头时将整个文件内容返回给客户端
fs.createReadStream(p).pipe(res);
}
})
app.listen(3000, () => {
console.log(`server is running at port 3000`)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
测试 可以通过wget命令来测试,-c是启用断点下载。
wget -c -d --limit-rate=2048k -O target "http://localhost:3000"
1
由于只是一个demo,用来做下载测试的,所以用nodejs做了个简单的,线上的话还是不要用这个了,有很多方案可以解决。
上次更新: 2024/01/30, 00:35:17
- 01
- Node与GLIBC_2.27不兼容解决方案08-19
- 02
- Git清空本地文件跟踪缓存08-13