HTTP之断点续传教程

这里主要是理解http断点续传的原理,如何通过http请求头操作,以及相应的请求和响应头的设置。

server端实现

// 断点续传

// 客户端要发一个头 Range:bytes = 0 -1

// 服务端返回一个头

// Accept-Ranges:bytes

// COntent-Ranges: 0-10/总大小

const http = require('http')

const fs = require('fs')

const path = require('path')

const {promisify} = require('util')

const stat = promisify(fs.stat) // 将方法promise化

const server = http.createServer(async (req, res) => {

// 拼接文件路径,读取文件大小

let p = path.join(__dirname, 'content.txt')

let statObj = await stat(p)

let start = 0

let end = statObj.size //可读流是包前包后

let total = end

// 读取文件大小

// 读取请求头

let range = req.headers['range']

// 如果有请求头部,则进行分片读取

if (range) {

// 设置请求头,告诉浏览器支持分片下载

res.setHeader('Accept-Ranges', 'bytes')

// 拿到起始位置和结束为止

let result = range.match(/bytes=(\d*)-(\d*)/)

start = result[1] ? result[1] - 0 : start

end = result[2] ? result[2] - 1 : end

// 获取成功 并且文件总大小告诉客户端

res.setHeader('Content-Range', `${start}-${end}/${total}`)

}

res.setHeader('Content-Type', 'text/plain;charset=utf8');

fs.createReadStream(p, {start, end}).pipe(res)

})

server.listen(3000)

// server启动成功

server.on('listening', () => {

console.log('http启动完成')

})

// 关闭HTTP服务器

server.on('close', () => {

console.log('服务器关闭')

})

// 服务器监听错误

server.on('error', e => {

console.log(e)

})

模拟客户端

这里使用node模拟客户端

const http = require('http')

const fs = require('fs')

const path = require('path')

let ws = fs.createWriteStream(path.join(__dirname, './download.txt'))

let pause = false

let start = 0

let step = 10

// 请求参数

let options = {

hostname: 'localhost',

port: 3000,

path: '/',

methods: 'GET'

}

/**

* @description 下载文件

*/

function download () {

// 跟新请求头

options.headers = {

Range: `bytes=${start}-${start step}`

}

// 更新下标

start = step

// 发送请求

http.get(options, res => {

let range = res.headers['content-range']

let total = range.split('/')[0]

let buffers = []

res.on('data', chunk => {

buffers.push(chunk)

})

// 合并文件 并写入本地磁盘

res.on('end', () => {

ws.write(Buffer.concat(buffers))

console.log('end', buffers.toString())

// 如果不是暂停,并且没有大于文件总长度,才会继续下载

// if (pause === false && start < total) download()

// 为了展示效果,这里做一个手动延迟

setTimeout(() => {

if (pause === false && start < total) download()

}, 5000)

})

})

}

download()

// 下载 每次获取10个 我们在控制台进行操作 输入p是暂停,其他任意键是继续

process.stdin.on('data', chunk => {

chunk = chunk.toString()

if (chunk.includes('p')) {

pause = true

} else {

pause = false

download()

}

})

总结

通过以上简单的代码,对断点续传,以及http请求头做了一个学习和体会,知道了Accept-Range的作用,其实很多东西都可以通过请求头和响应头来操作,只是目前太菜了 好多还只能看看….

(0)

相关推荐

  • 完美一键装机如何重装电脑系统?完美一键装机重装电脑系统详细图文教程

    如何使用完美一键装机重装电脑系统?下面小编就给大家带来完美一键装机重装电脑系统详细的教程介绍,感兴趣的朋友们可以过来看看。 1.首先运行完美一键装机软件,然后点击备份还原资料如下图所示: 2.点击按钮 ...

  • 土豆视频播放器itudou的使用教程

    土豆视频播放itudou是很多网友都会下载的一款播放器,不仅可以观看一些土豆视频播放器里的所有视频还可以上传自己拍摄的视频,也可以下载视频.同时,这款土豆视频播放器还支持视频转码,可以将自己想收看的视 ...

  • Allavsoft如何转换视频格式 Allavsoft转换视频格式教程攻略大全

    Allavsoft是一款功能强大的视频下载工具,快速下载.免费下载,支持断点续传,突然网络中断,也能待网络恢复后继续下载,而且Allavsoft视频下载工具还支持视频格式转换功能,支持所有主流媒体格式 ...

  • 暴雪战网客户端安装不了怎么办?战网客户端安装教程及无法安装解决办法

    暴雪战网客户端怎么安装?战网客户端安装不了怎么回事?应该怎么解决?暴雪战网客户端是由暴雪公司架设的游戏对战平台,战网是一种直接连入Internet的方式,它可以使得来自世界各地的游戏者相互探险旅行,诸 ...

  • 关于windows下获取4s的siri里面的key补编教程

    近日大家对siri都感兴趣,咱们小4有了突破,但是好多人有4s不知道怎么获得key,下面就看看关于windows下获取4s的siri里面的key补编教程吧。 1、你的小4必须要有siri,我用的是sp ...

  • 用U盘助手快速U盘装系统图文教程详解全过程

    新手必看:针对大文件传输,u盘助手提供了u盘的NTFS格式化功能。 系统文件一般有二种格式:ISO格式和GHO格式。ISO格式又分为原版系统和GHOST封装系统二种。只要用解压软件WinRAR解压后有 ...

  • ghost11使用教程 ghost使用指南[图文]

    ghost一键备份还原工具目前已经发展到ghost11,对于以后的版本只是在性能上有所优化,对于操作界面使用方法仍然是与原来的大同小异!本文将详细为您讲解ghost的使用教程,包含ghost启动,备份 ...

  • ios5.01越狱后iphone美化教程(替换锁屏文字的路径)

    相信拥有iphone4的粉丝们都升级5.0.1并且完美越狱了吧!??完美越狱后的iphone,爱机人士肯定少不了美化,尤其是些女生,那么在此我来谈谈美化吧!!不多说,先上图,喜欢的就来学一学哈。有附件 ...

  • 图文结合ipad2授权教程,就不信你们搞不定

    很多新入手ipad2的朋友不懂啥是授权,尤其是要多人分享的授权时更是频频闪退,让很多人只能干着急 我建议使用虚拟机进行如下操作,效率会比较高,不会虚拟机的本机操作也可以 授权分为两种情况:一个人多个账 ...