今天使用了 request 模块的时候,想获取每次请求的大小,以方便判断下载进度,网速等等。。
然后 content-length 头总是获取不到,下面给出解决方法
request
模块的使用方法见 api 文档 :
https://github.com/request/request
解决方法
很简单,只需要在 request(url) 之前,请求一次目标地址
来看官方解释:
Request can also pipe
to itself. When doing so,content-type
and 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("任务结束")
})