You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在NWJS中下载文件时显示并更新进度条

解决NWJS下载文件时实时更新进度条的问题

我来帮你搞定这个实时进度条的需求!你的现有代码只处理了下载完成后的状态,没有监听下载过程中的数据传输事件,所以没法实时计算进度。下面是完整的解决方案,我会一步步解释怎么改:

核心思路

要实现实时进度,我们需要:

  1. 从响应头里获取文件的总大小content-length字段)
  2. 监听data事件,累加每次收到的字节数
  3. 计算已下载的百分比,动态修改进度条的宽度
  4. 处理下载完成、错误等边界情况

修改后的完整代码

var fs = require('fs');
var https = require('https');
var filepath = '你的目标文件路径'; // 替换成实际路径
var fileurl = '你的下载URL'; // 替换成实际URL

var fileStream = fs.createWriteStream(filepath);
var totalFileSize = 0;
var downloadedSize = 0;

https.get(fileurl, function (response) {
    // 从响应头获取文件总大小,注意转成数字类型
    totalFileSize = parseInt(response.headers['content-length'], 10);

    // 监听数据传输事件:每收到一段数据就更新进度
    response.on('data', function(chunk) {
        downloadedSize += chunk.length;
        if (totalFileSize > 0) { // 确保能拿到总大小才计算百分比
            var progress = (downloadedSize / totalFileSize) * 100;
            // 动态设置进度条宽度(这里假设#progressbar_upload是进度条的填充元素)
            $('#progressbar_upload').width(progress + '%');
        }
    });

    // 把响应流写入文件
    response.pipe(fileStream);

    // 下载完成后的收尾操作
    fileStream.on('finish', function() {
        // 确保进度条拉满,然后标记成功状态
        $('#progressbar_upload').width('100%').addClass('bg-success');
        uploadDone();
    });

    // 处理文件写入错误
    fileStream.on('error', function(err) {
        console.error('写入文件出错:', err);
        $('#progressbar_upload').addClass('bg-danger');
        // 这里可以添加错误提示逻辑
    });

    // 处理请求响应错误
    response.on('error', function(err) {
        console.error('下载请求出错:', err);
        $('#progressbar_upload').addClass('bg-danger');
    });
});

重要注意事项

  • 进度条HTML结构要匹配:你的进度条需要是“容器+填充元素”的结构,比如:
    <div class="progress-container" style="width: 100%; height: 24px; border: 1px solid #ddd; border-radius: 4px;">
        <div id="progressbar_upload" style="height: 100%; background-color: #2196F3; width: 0%; transition: width 0.2s ease;"></div>
    </div>
    
    这样修改width才能直观展示进度,加上transition还能让进度变化更平滑。
  • 兼容无content-length的情况:有些服务器不会返回content-length(比如分块传输),这时候totalFileSize会是NaN,我们可以加个判断,这种情况下可以显示“正在下载...”的文本,或者用动画效果代替百分比进度。
  • 确保jQuery可用:NWJS里要确保已经正确引入jQuery,比如在HTML里通过<script>标签引入,或者用require加载。

内容的提问来源于stack exchange,提问作者4123

火山引擎 最新活动