语言:nodejs 包:express fs
通过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`)
})
可以通过wget命令来测试,-c是启用断点下载。
wget -c -d --limit-rate=2048k -O target "http://localhost:3000"
由于只是一个demo,用来做下载测试的,所以用nodejs做了个简单的,线上的话还是不要用这个了,有很多方案可以解决。