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('不存在')
}
[node] 使用got库是实现断点续传和展示进度
于 2023-04-16 23:10:18 首次发布
该代码片段首先检查本地是否存在指定版本的Node.jsMSI文件,如果存在则比较文件大小是否完整。若不完整或文件不存在,它将从Node.js官网开始下载,使用Content-Range头进行范围请求,实现断点续传。下载过程中显示进度信息,并处理可能的错误。
摘要由CSDN通过智能技术生成