nodejs版本大文件之断点下载

nodejs版本大文件之断点下载

点点

2021-04-26 20:33 阅读 761 喜欢 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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
好用的下载有不少,我们如何不让迅雷接管其他下载?怎么不让迅雷自动接管下载任务?我们在电脑下载文件时喜欢使用迅雷接管下载,那如果不想使用迅雷下载,该怎么取消迅雷接管下载呢?
为实现华为手机与电脑的文件传输与共享,以下需要在手机和电脑上所做的设置是一次性的,在最初使用前设置好即可,以后使用时无需再次设置。
一般通过手机QQ、微信等应用接收或下载的音乐文件在层层文件夹的下面,所以使用华为音乐不能够直接搜索到,好麻烦,基本视频合成剪辑自己合成时候好难,为这个音频用了半个小时的时间,具体解决办法跟点点来看一下吧!
现在智能化的时代,微信与QQ是最流行的聊天软件,但是咱们一直被吃内存而烦恼,个人建议进行备份后,再进行清理,现在小编教小伙伴们如何清理QQ的聊天记录。
小伙伴们都知道百度网盘是一个功能十分齐全的网盘工具,可以说这里面能存储的内容有很多,除了文件、图片等,还能起到一个备份作用。那么百度网盘可以备份我们的聊天记录吗?
平常很多小伙伴喜欢看小说,问小编微信上怎么看,手机版微信读书软件被很小伙伴们使用,用来看小说等,有的小伙伴在使用该软件时,想要读更多有权限的小说,因此想要获得无限卡,但是却不知道如何获取,那么小编就来为小伙伴们介绍一下吧。
现在小伙伴们都离开不了手机,它逐渐成为我们生活中必不可少的一样生活用品。很多小伙伴在用了 iPhone6 以后,遇到系统提示内存不足的问题。对于智能手机,相信小伙伴们都知道,同款机型不同内存大小,价格会相差很多,特别是对应iPhone这样的土豪手机,不同的内存版本更是相差多则上千。而很多当初选择了小内存的手机用户,发现在使用过程中彻底不够用。
钉钉电子签名基于钉钉强大的安全保障体系,确保用户签名的真实性和不可篡改性。用户可以在钉钉应用中轻松完成签名操作,无论是审批流程、合同签署还是其他需要签名的场景,都能快速完成签名任务。可以帮到小伙伴们涨知识呦!