nodejs版本大文件之断点下载

nodejs版本大文件之断点下载

点点

2021-04-26 20:33 阅读 734 喜欢 0

框架

语言: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做了个简单的,线上的话还是不要用这个了,有很多方案可以解决。

转载请注明出处: http://sdxlp.cn/article/nodejs.html


如果对你有用的话,请赏给作者一个馒头吧 ...或帮点下页面底部的广告,感谢!!

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
互联网应用经常需要存储用户上传的图片,比如facebook相册。
腾讯QQ现在生活中用到的时候基本就是游戏啦!工作中也就是传一些大的文件,可是为了工作的高效性,很多的小伙伴想知道传了文件,马上关掉QQ,是不是文件对方 收不到啦?现在小编带小伙伴们去解惑。
平时免不了要换手机号,换手机。但是我们并不想换手机号和手机后我们的朋友不见啦!想再保留下来该如何处理哪?换手机登微信的时候需要验证你在微信上绑定的手机号码。如果我们把手机号码换了,怎么办了?
我们在平常的工作与学习时,会经常使用到wps软件来编辑文档或者表格,但有时也会碰到一些问题,如程序无响应,电脑死机等等,这时就只能重启解决,可假如这时文档还没有保存,编辑的内容就全没了,要怎么办才好?
微信收款码是分为个人码和商家码两种,虽然看似差不多,但其实功能上是有差别的。商家收款码不仅支持顾客使用信用卡支付,还可以享受直接提现等便利功能。那么微信商家收款码怎么申请?第一步商户需要开通微信收款商业版。
网络是有记忆的,有过联系就会留下痕迹,QQ十年前的好友删除了该怎样找回?嘿嘿,关注点点,让小伙伴们回到青春时的回忆!直接给小伙伴们上干货啦!跟着点点来!
日常生活中,我们经常用到微信,微信退了忘记了密码咋办?那么如何才能在不知道原始密码的情况下重置密码呢?
一直在做K12教育方面的产品,不过大都是学校管理层面的,对于教学一直很少触及。当然,这类的产品已经存在不少了,在功能、设计方面我们都会借鉴一些进行改进,其中有一些基础数据.需要的话,看文章低端。