[node] 使用got库是实现断点续传和展示进度

该代码片段首先检查本地是否存在指定版本的Node.jsMSI文件,如果存在则比较文件大小是否完整。若不完整或文件不存在,它将从Node.js官网开始下载,使用Content-Range头进行范围请求,实现断点续传。下载过程中显示进度信息,并处理可能的错误。
摘要由CSDN通过智能技术生成
import fs from 'fs'
import got from 'got'


const http = await got.get('https://nodejs.org/dist/v18.12.1/node-v18.12.1-x64.msi', {
    headers: {
        'range': 'bytes=0-1'
    }
})
// console.log(http.headers['content-range'])

const totalSize = http.headers['content-range'].split('/').reverse()[0]
const isExist = fs.existsSync('./software/node-v18.12.1-x64.msi')
if (isExist) {
    const fileSize = fs.statSync('./software/node-v18.12.1-x64.msi').size
    console.log(fileSize, totalSize)
    if (totalSize == fileSize) {
        console.log('已经下载')
        
    } else {
        // const partSize = 1024 * 1024 * 4 // 4M
        // console.log(totalSize)

        const downloadStream = got.get('https://nodejs.org/dist/v18.12.1/node-v18.12.1-x64.msi', {
            isStream: true,
            headers: {
                'range': `bytes=${fileSize}-`
            }
        })
        // console.log('downloadstream',downloadStream)
        // const pipeline = promisify(stream.pipeline);

        const ws = fs.createWriteStream('./software/node-v18.12.1-x64.msi', {start: fileSize, flags: 'r+'})
        // await pipeline(
        // 	fileStream,
        // 	ws
        // );
        downloadStream
            .on("downloadProgress", ({ transferred, total, percent }) => {
                const percentage = Math.round((transferred + fileSize) / totalSize * 100);
                // if (percentage > 101) {
                //     downloadStream.destroy()
                // }
                console.error(`progress: ${transferred}/${total} (${percentage}%)`);
            })
            .on("data", chunk => {
                ws.write(chunk)
            })
            .on("error", (error) => {
                ws.end()
                console.error(`Download failed: ${error.message}`);
            })
            .on("end", () => {
                ws.end()
                console.log('download end')
            })

        ws.on('error', function (e) {
            console.log('ws error', e)
        })
    }
} else {
    console.log('不存在')
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值