nodejs版本大文件之断点下载

简介: 由于只是做个测试,这里使用了expresss简单搭建了个后台服务,提供文件断点下载。

断点下载这种操作比较常见,今天又用到了,用来做demo,简单搭建一个,一时去找也还找不到,想着也不麻烦,先做个demo试试。

框架

语言: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"

wget windows 下载:wget windows 下载地址

由于只是一个demo,用来做下载测试的,所以用nodejs做了个简单的,线上的话还是不要用这个了,有很多方案可以解决。

相关文章
|
1月前
|
JavaScript 内存技术
node与npm版本对应关系以及使用nvm管理node版本
node与npm版本对应关系以及使用nvm管理node版本
164 0
|
3月前
|
前端开发 JavaScript 数据安全/隐私保护
无感刷新token(vue2+nodejs版本)
无感刷新token(vue2+nodejs版本)
|
27天前
|
JavaScript 内存技术
不同版本NodeJS切换使用
不同版本NodeJS切换使用
12 0
|
1月前
|
内存技术
node版本与npm版本不对应的解决方案
node版本与npm版本不对应的解决方案
25 0
|
2月前
|
JavaScript 前端开发 算法
【Node.js 版本过高】运行前端时,遇到错误 `Error: error:0308010C:digital envelope routines::unsupported`
【Node.js 版本过高】运行前端时,遇到错误 `Error: error:0308010C:digital envelope routines::unsupported`
66 0
|
2月前
|
JavaScript
查看NodeJs版本和查看NPM版本
查看NodeJs版本和查看NPM版本
48 0
查看NodeJs版本和查看NPM版本
|
2月前
nodejs17/18版本报错:digital envelope routines::unsupported
nodejs17/18版本报错:digital envelope routines::unsupported
43 0
|
2月前
|
缓存 JavaScript
mac升级node到指定版本
mac升级node到指定版本
|
2月前
|
JavaScript 内存技术
nvm安装和切换node使用版本
nvm安装和切换node使用版本
|
2月前
|
Ubuntu Unix Linux
node-sass版本适配问题
node-sass版本适配问题
32 0