Node——Request、Fetch 实现文件下载

1. 方案一、request

const request = require("request")
const fs = require('fs');
const progress = require('progress-stream')
const https = require("https")
const http = require("http")

/* 下载文件地址 */
let url = "https://archive.apache.org/dist/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.zip"
/* 文件存储地址 */
let targetUrl = `E:\\development\\myProject\\pc-dev-tool\\download\\apache-maven-3.8.5-bin.zip`

/* 下载文件
		@param url 文件地址
		@param targetUrl 存储地址
	 */
async function downloadUrlFile(url, targetUrl) {
	let stream = fs.createWriteStream(targetUrl)
	let p = await setDownloadProgress(url, fn)
	let downloadRequest = request(url)
	downloadRequest.pipe(p).pipe(stream)
}

/* 获取文件大小 */
function getUrlFileSize(url) {
	return new Promise(r => {
		let h = { http, https }
		let isHttps = url.indexOf("https") != -1
		h[isHttps ? "https" : "http"].get(url, {
			rejectUnauthorized: false
		}, (res) => {
			r(res.headers['content-length'])
		})
	})
}

/* 设置下载进度 */
async function setDownloadProgress(url, fn) {
	let p = progress({
		length: await getUrlFileSize(url),
		time: 500
	})
	p.on('progress', progress => {
		console.log("下载进度:", progress.percentage)
	});
	return p
}

/* 执行 */
downloadUrlFile(url,targetUrl)

2. 方案二、fetch

注:node-fetch版本过高可能会报错,当前用的是 “node-fetch”: “^2.6.1”

const fetch = require('node-fetch')
const fs = require('fs');
const progressStream = require('progress-stream')
const AbortController = require("abort-controller")

/* 下载文件地址 */
let url = "https://archive.apache.org/dist/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.zip"
/* 文件存储地址 */
let target = `E:\\development\\myProject\\pc-dev-tool\\download\\apache-maven-3.8.5-bin.zip`

/* 创建文件流 */
const fileStream = fs.createWriteStream(target).on('error', function(e) {
	console.error('错误', e)
}).on('ready', function() {
	console.log("开始下载:");
}).on('finish', function() {
	console.log('文件下载完成:');
});

fetch(url, {
	method: 'GET',
	headers: {
		'Content-Type': 'application/octet-stream'
	},
}).then(res => {
	/* 获取请求头中的文件大小数据 */
	let length = res.headers.get("content-length");
	/* 创建进度 */
	let str = progressStream({
		length,time: 100
	});
	str.on('progress', function(progressData) {
		let percentage = Math.round(progressData.percentage) + '%';
		console.log(percentage);
	});
	res.body.pipe(str).pipe(fileStream);
}).catch(e => {
	//自定义异常处理
	console.log(e);
});
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用fetch进行文件下载的方法如下所示: ```javascript fetch(url, { method: 'GET', responseType: 'blob' // 设置响应类型为blob }) .then(response => response.blob()) // 将响应转换为Blob对象 .then(blob => { const fileURL = window.URL.createObjectURL(blob); // 创建一个URL,该URL表示了Blob对象的内容 const link = document.createElement('a'); // 创建一个链接元素并设置其属性 link.href = fileURL; link.download = 'filename.pdf'; // 设置下载文件的名称 link.click(); // 模拟点击下载链接 window.URL.revokeObjectURL(fileURL); // 释放创建的URL对象 }) .catch(error => { // 处理错误 }); ``` 在上述代码中,我们通过设置`responseType`为`blob`来告诉fetch请求返回的是一个Blob对象。然后,我们将响应转换为Blob对象,并创建一个URL来表示该Blob对象的内容。最后,我们创建一个链接元素,设置其属性为文件URL和下载文件的名称,模拟点击链接来进行文件下载。记得在下载完成后释放创建的URL对象。 希望这个回答对您有帮助! #### 引用[.reference_title] - *1* [Fetch API下载文件](https://blog.csdn.net/zzy417/article/details/131231748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [fetch处理数据流下载](https://blog.csdn.net/ze1024/article/details/117385787)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值