nodejs版本大文件之断点下载

nodejs版本大文件之断点下载

月光魔力鸭

2020-05-20 11:17 阅读 1933 喜欢 1 断点下载 nodejs express

断点下载这种操作比较常见,今天又用到了,用来做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做了个简单的,线上的话还是不要用这个了,有很多方案可以解决。

转载请注明出处: https://chrunlee.cn/article/nodejs-file-range-download.html


感谢支持!

赞赏支持
提交评论
评论信息 (请文明评论)
暂无评论,快来快来写想法...
推荐
开始入手webpack ,直接看的官方文档和demo,对于自动刷新这部分还是希望通过express 加载插件来控制,但是文档没有提供,经过参考github上其他高玩的套路,最终整理了一个基础的配置版本。
最近又回归了下DNF ,玩了一段时间,感觉也挺没意思的,关键是平时更没意思,想着不行搞个自动刷图吧(先说结论,没成)
thinkjs框架使用ueditor记录。
当我们想实现一个自己的库或模块后,发布的话,需要发布到npm上才能下载。以下是具体步骤
在开发项目过程中,经常需要将开发的项目部署到服务器上,但是每个环境都有每个环境的配置等等,如果每次打包的时候都要去调整(可能删除、替换等),那就很烦人了,这里分享下自己实现的几个简单的小工具(当然这个工具可能只对我自己有用),希望能够帮到你。
关于js的编译和压缩,之前做过一个小工具了,主要就是自己项目成员大都没有这部分的技能,导致发布的时候总需要去编译压缩下.. 最终做了个命令行小工具.. 问题不在这里,前一阵子做压缩的时候发现压缩后竟然是undefined.最终才发现是es6的语法问题。
互联网应用经常需要存储用户上传的图片,比如facebook相册。 facebook目前存储了2600亿张照片,总大小为20PB,每张照片约为80KB。用户每周新增照片数量为10亿。(总大小60TB),平均每秒新增3500张照片(3500次写请求),读操作峰值可以达到每秒百万次
近期有个小工具,需要使用到本地数据库,想使用sqlite ,本来以为是个手到擒来的活... 没成想卡在了开始上。