NodeJS使用Range请求实现下载功能的方法示例_node.js_脚本之家

相信现在早已了然什么是限制央浼,范围央浼客商端和服务端供给做些什么,其实轻便正是对应的央求头和响应头的施用,需求注意的是节制央求的响应状态码为
206,那样的需要在局地上传、下载财富的网址也很遍布,其目标就是为了让我们贯彻断点续传,不至于一遍未有上传或下载完结的财富文件,在下壹遍的做同样操作时索要重头开始,能够随着上次的岗位一连,范围乞请在摄像网址上也广泛应用,边哀告边寓目,不至于叁回加载整个摄像财富,节省流量,节省时间。

在上边代码中下载的文件通过 config 中的 path 属性配置,每便调用 download
函数下载时都会重新总结当前范围央求的起来地方和告竣地方,并设置 Range
必要头,下壹遍呼吁靠递归 download 来兑现。

// 文件:client.jsconst http = require;const fs = require;const path = require;// 请求配置let config = { host: "localhost", port: 3000, path: "/download.txt"};let start = 0; // 请求初始值let step = 5; // 每次请求字符个数let pause = false; // 暂停状态let total; // 文件总长度// 创建可写流let ws = fs.createWriteStream(path.resolve(__dirname, config.path.slice;// 下载函数function download() { // 配置,每次范围请求 step 个字节 config.headers = { "Range": `bytes=${start}-${start + step - 1}`; }; // 维护下次 start 的值 start += step; // 发送请求 http.request(config, res => { // 获取文件总长度 if (typeof total !== "number") { total = res.headers["content-ranges"].match[1]; } // 读取返回数据 let buffers = []; res.on("data", data => buffers.push; res.on => { // 合并数据并写入文件 let buf = Buffer.concat; ws.write; // 递归进行下一次请求 if (!pause && start < total) { download;}// 监控输入process.stdin.on("data", data => { // 获取指令 let ins = data.toString[1]; switch  { case "s": case "r": pause = false; download(); break; case "p": pause = true; break; }});
curl -v --header "Range:bytes=0-5" http://localhost:3000

为了方便,大家的下载顾客端是在命令行窗口运维的,通过指令来模拟实际项目中的开端下载、暂停和复苏按键,当在窗口中输入
s 指令时带头下载,输入 p 指令时暂停下载,输入 r 指令时上涨下载。

在实行时需先运营大家的服务器,在通过命令行输入 node client.js
来运转客商端,在指令窗口输入相应的通令实行开头下载、暂停下载和回复下载操作。

npm install mz

// 文件:server.jsconst http = require;const path = require;const url = require;// 引入 mz 模块转换成 Promise 的 fs 模块const fs = require;// 请求处理函数async function listener { // 获取 range 请求头,格式为 Range:bytes=0-5 let range = req.headers["range"]; // 下载文件路径 let p = path.resovle(__dirname, url.parse; // 存在 range 请求头将返回范围请求的数据 if  { // 获取范围请求的开始和结束位置 let [, start, end] = range.match; // 错误处理 try { let statObj = await fs.stat { res.end; } // 文件总字节数 let total = statObj.size; // 处理请求头中范围参数不传的问题 start = start ? ParseInt : 0; end = end ? ParseInt : total - 1; // 响应客户端 res.statusCode = 206; res.setHeader("Accept-Ranges", "bytes"); res.setHeader("Content-Range", `bytes ${start}-${end}/${total}`); fs.createReadStream.pipe; } else { // 没有 range 请求头时将整个文件内容返回给客户端 fs.createReadStream; }}// 创建服务器const server = http.createServer;// 监听端口server.listen => { console.log;});

行使 mz 在此之前供给先安装:

上述就是本文的全体内容,希望对大家的上学抱有支持,也希望大家多都赐教脚本之家。

在上边使用 curl
命令来做客我们的服务器时,只可以诉求固定范围的数据,并不是看似于下载功能,每一次都下载一个限定的数量,然而想要数十次下载并自动珍视Range 的限制必要依据我们和好实现的客商端逻辑。

假诺是 Range
诉求则通过可读流读取对应的剧情重返客商端,如若不是,则透过可读流读取全方位文件再次回到想客端,在响应
Range 央求的历程中须要设置响应状态为 206,须要安装响应头 Accept-Ranges
值为 bytes,要求设置响应头 Content-Range 值为 byte 0-5/100 的格式,0
为回去数据开始的目录,5 为终结的目录,100 为文件的总字节数。

前言

总结

在地点服务端的代码中,要求相称 Range
央浼和常常诉求,二种乞请的区分是,借使客商端发送的是 Range 央浼,会带走
Range:bytes=0-5 格式的号召头,大家能够透过 req 的 headers
属性获取,在获得央求头时,原来大写字母初始 NodeJS
统一管理成小写,所以得到时应小写。

本篇使用 NodeJS 的 HTTP 服务成立客商端,使用 Range
央求实现下载功效,并因而本篇的 Demo
扩大在专业中落到实处断点续传等效用的笔触。

小编们透过 http 模块创设服务器管理 Range
央浼,在服务器代码中大家为了缩小回调嵌套使用 async
函数,所以要求将异步的操作方法转换来 Promise,今后大家利用 util 的
promisify 来三个三个转换异步方法,比较麻烦,大家本次运用第三方模块 mz
并直接引进调换好的替代模块。

服务端的完成

咱俩得以运用 curl
命令来检查评定大家的服务端代码,在命令行工具中输入下边三令五申,在指令窗口查看重返值是或不是准确。

在通过 url 和 path
模块解析和东挪西借下载文件路线时,应该展开不当检查测量试验,要是文件不真实则直接重返客商端
Not Found。

顾客端的贯彻

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图