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


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

赞赏支持
提交评论
评论信息(请文明评论)
暂无评论,快来快来写想法...
推荐
腾讯公司的QQ软件是小伙伴们最喜爱的通讯软件之一,可是有些小伙伴还不太熟悉它的一些设置,比如,很多小伙伴们不清楚怎么恢复已删除的QQ好友和QQ群,小编今天给小伙伴们分享解决这个问题的方法。
电脑版微信怎么发朋友圈,最近有很多小伙伴都在问关于微信电脑版的一些问题,小编下面给小伙伴们带来微信pc端发朋友圈教程分享,感兴趣的小伙伴们不要错过了哦,希望这篇文章能对小伙伴们有所帮助。
iOS15正式版推出以后,受到了很多小伙伴的关注,因为更新了更多全新的功能,所以很多小伙伴们都想要更新尝试,所以全新的系统,很多小伙伴们想要知道iOS15门禁卡怎么添加?那么下面就让点点给小伙伴们介绍一下。
日常生活工作中,会用到Word 文件转换成 PDF 文件的事情,下边就跟小编来看一下吧!
手机是我们生活中必备的生活用品,几乎人人都有一部手机,如今手机越来越智能化,也下载了越来越多的智能软件及娱乐软件,比如微信的内存异常的大,如果内存比较的小的手机,垃圾软件及垃圾文件占了内存后,手机就会变得很卡,这里点点把清内存的方式分享给小伙伴们。
方法很简单,一学就会,来看看下面文章就知道 了,希望能够帮助到您。
小程序需要用到用户的手机号码,看了下API 以及相关的demo,基本都是服务端进行解密的,问题是需要的参数并没有用到secret,只需要 session_key / iv /encryptedData 即可,那完全可以在客户端进行处理啊。
智能化的时代,聊天工具是不可缺的,QQ是80后一代的青春回忆,不知道还有没有小伙伴们在用,最近一直在研究这个青春,嘿嘿,方法来了,跟小编来看一下吧。