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)
    })
})

高级扩展

  1. headers会返回要下载文件的大小, 每次写入的value是可以计算长度的, 那么我们就可以实现下载进度的计算 .
  2. 可以结合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(()=>{
//下载完了,做点什么事
})

还可以做更多的事情吧,等有需求再探索.

posted @ 2022-03-10 22:21  apuyuseng  阅读(588)  评论(0编辑  收藏  举报