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

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('不存在')
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Node.js的断点可以通过以下步骤完成: 1. 首先,需要在服务器端实现文件分块上。可以使用`fs.createReadStream()`方法读取文件,并使用`fs.createWriteStream()`方法将文件写入服务器。在此过程中,可以使用`fs.stat()`方法获取文件大小,并使用`Math.ceil()`方法将文件大小除以块大小并向上取整,以确定需要分成多少块。 2. 接下来,需要在客户端实现文件分块上。可以使用XMLHttpRequest对象将文件分成块,并使用FormData对象将每个块上到服务器。在此过程中,需要使用`Blob.slice()`方法将文件分成块,并使用`XMLHttpRequest.setRequestHeader()`方法设置请求头,以便服务器知道客户端正在上哪个块。 3. 最后,需要在服务器端实现断点。可以使用`fs.createReadStream()`方法读取已上的文件块,并使用`fs.createWriteStream()`方法将文件块写入服务器。在此过程中,需要使用`fs.appendFile()`方法将新的文件块追加到已上的文件块中。 以下是一个简单的Node.js断点的示例代码: ```javascript const http = require('http'); const fs = require('fs'); const path = require('path'); const server = http.createServer((req, res) => { if (req.method === 'POST') { const filePath = path.join(__dirname, 'uploads', req.headers['file-name']); const fileSize = parseInt(req.headers['file-size'], 10); const chunkSize = 1024 * 1024; let offset = parseInt(req.headers['file-offset'], 10) || 0; const writeStream = fs.createWriteStream(filePath, { flags: offset === 0 ? 'w' : 'a', start: offset, }); req.on('data', (chunk) => { writeStream.write(chunk); offset += chunk.length; if (offset >= fileSize) { writeStream.end(() => { res.end('Upload complete'); }); } }); } else { res.end('Hello World!'); } }); server.listen(3000, () => { console.log('Server started on port 3000'); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值