Node断点下载

 

function downloadFile(url,savefile){

    //如果文件已存在,获取长度
	 var receivedBytes=0; 
	 if(fs.existsSync(savefile)){
		 var stats = fs.statSync(savefile);
		var receivedBytes=stats.size; 
		console.log("续传");
	 }
	 
	//发送请求时,增加一个range头
    var opts={
		headers:{'Range':`bytes=${receivedBytes}-`}
	}
	console.log(opts);
	var req = https.request(url,opts);
	 // 通过flag指定文件是新建还是追加
	var file = fs.createWriteStream(savefile,{
		start:receivedBytes,
		flags:receivedBytes>0?'a+':'w'
	});
    //收到请求的回复后
	req.on('response', function(res){
		var len = parseInt(res.headers['content-length'], 10);//当前内容总长度
		var rangelen = res.headers['content-range'];//获取内容的字节范围
        res.pipe(file);
		var bar = new ProgressBar(savefile+' downloading [:bar] :rate/bps :percent :etas', {
			complete: '=',
			incomplete: ' ',
			width: 20,
			total: len
		});
        //回复数据流收到数据,更新进度条
		res.on('data', function (chunk) {
			bar.tick(chunk.length);
		  });
        //回复数据流结束
		res.on('end', function () {
			console.log('\n');
		});

	})
	req.end();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现Node.js的断点下载,我们可以使用HTTP请求头中的Range属性。Range属性指定了客户端想要获取的资源的范围,服务器可以根据这个范围返回相应的数据。以下是一个简单的Node.js实现断点下载的例子: ```javascript const http = require('http'); const fs = require('fs'); const file = 'example.mp4'; const port = 3000; http.createServer((req, res) => { const stat = fs.statSync(file); const fileSize = stat.size; const range = req.headers.range; if (range) { const parts = range.replace(/bytes=/, '').split('-'); const start = parseInt(parts[0], 10); const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1; const chunkSize = end - start + 1; const fileStream = fs.createReadStream(file, { start, end }); const head = { 'Content-Range': `bytes ${start}-${end}/${fileSize}`, 'Accept-Ranges': 'bytes', 'Content-Length': chunkSize, 'Content-Type': 'video/mp4', }; res.writeHead(206, head); fileStream.pipe(res); } else { const head = { 'Content-Length': fileSize, 'Content-Type': 'video/mp4', }; res.writeHead(200, head); fs.createReadStream(file).pipe(res); } }).listen(port, () => { console.log(`Server running at http://localhost:${port}/`); }); ``` 在这个例子中,我们创建了一个HTTP服务器,监听在3000端口。当客户端请求example.mp4文件时,服务器会读取文件的大小,并根据请求头中的Range属性返回相应的数据。如果请求头中没有Range属性,服务器会返回整个文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值