fetch 下载文件
很多教程上介绍的都是浏览器上的方法,即创建一个链接,触发点击,然后实现下载.
另一种是用node-fetch
,现在本身就有fetch, 干嘛还要用第三方库...
代码实现
const fs = require('fs');
let fileStream = fs.createWriteStream(name, { flags: 'w' })
fetch(url).then(r => r.body.getReader()).then(reader => {
reader.read().then(function processText({ done, value }) {
if (done) {
return
}
fileStream.write(value)
return reader.read().then(processText)
})
})
高级扩展
headers
会返回要下载文件的大小, 每次写入的value
是可以计算长度的, 那么我们就可以实现下载进度的计算 .- 可以结合
Promise
,在文件下载完后行对文件进行处理等操作.
抛砖引玉:
const fs = require('fs');
function download(url, name, result) {
return new Promise((resolve) => {
let fileStream = fs.createWriteStream(name, { flags: 'w' })
let contentLength = 0
let completeLength = 0
fetch(url).then(r => {
contentLength = r.headers.get('content-length');
result.size = (contentLength / 1024 / 1024).toFixed(2) + "MB"
return r.body.getReader()
}).then(reader => {
reader.read().then(function processText({ done, value }) {
if (done) {
resolve(done, name, contentLength)
return
}
completeLength = value.length + completeLength
//进度
result.progress = Number((completeLength / contentLength) * 100).toFixed(2)
fileStream.write(value)
return reader.read().then(processText)
})
})
})
}
调用
let url="xxx"
// 下载下来的文件名
let nam = "mmm"
// watch result就可以实现进度条
let result = {progress:0, size:0}
download(url, name, result).then(()=>{
//下载完了,做点什么事
})
还可以做更多的事情吧,等有需求再探索.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?