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(()=>{
//下载完了,做点什么事
})
还可以做更多的事情吧,等有需求再探索.