node request 解决请求时 有时候 content-length 获取不到

今天使用了 request 模块的时候,想获取每次请求的大小,以方便判断下载进度,网速等等。。
然后 content-length 头总是获取不到,下面给出解决方法


request 模块的使用方法见 api 文档 :
https://github.com/request/request

解决方法

很简单,只需要在 request(url) 之前,请求一次目标地址

来看官方解释:

Request can also pipeto itself. When doing so,content-typeand content-length are preserved in the PUT headers.
“请求也可以通过管道传递到自身。执行此操作时,内容类型和内容长度将保留在PUT标头中。”

request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))

所以我们只需要这样做

const request = require('request');
const fs = require('fs');
const axios = require('axios')
/*
 * url 网络文件地址
 * filename 文件名
 * return  Promise
 */
function downloadFile(uri, filename) {
	var event = new EventEmitter();


	var stream = fs.createWriteStream(filename);
	//先访问一次uri目标地址,确保第二次可以拿到content -length 头
	request(uri)
	request(uri).on('response', response => {
		console.log(response)
		//监听data数据
		response.on('data', data => {
			event.emit('downloading', response.headers['content-length'], data.length);
		})
	
	})
	.pipe(stream).on('close', () => {
		event.emit('finish');
	})
 
	return event

}

export default downloadFile

使用 response.headers['content-length'] 获取 header content-length 的值

  • data.length 是此次接收的数据

downloadFile 这个可以当做工具类直接使用
例如:


let event = downloadFile('https://baidu.com/hello.zip', 'hello.zip')
let recive_length = 0
event.on('downloading', (total_length, length) => {
	//total_length 文件总长度
	//length 此次接收的长度
	recive_length += length
	//下载进度为:接收的总长度/总长度 * 100
	console.log(parseInt((recive_length / total_length) * 100))
})
event.on('finish', () => {
	console.log("任务结束")
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值