首页 > 其他分享 >监听下载上传进度

监听下载上传进度

时间:2024-10-13 23:18:04浏览次数:3  
标签:const xhr 进度 console 上传 监听

在Web开发中,监听文件的上传和下载进度是提升用户体验的重要功能。通过使用现代浏览器的API,我们可以轻松实现这个功能。以下是关于如何监听上传和下载进度的详细说明。

1. 监听文件上传进度

对于文件上传,通常使用XMLHttpRequest(XHR)或Fetch API。以下是如何通过这两种方法监听上传进度的示例。

使用 XMLHttpRequest
function uploadFile(file) {
    const xhr = new XMLHttpRequest();

    // 监听上传进度
    xhr.upload.addEventListener("progress", function(event) {
        if (event.lengthComputable) {
            const percentComplete = (event.loaded / event.total) * 100;
            console.log(`Upload progress: ${percentComplete.toFixed(2)}%`);
            // 这里可以更新进度条等UI元素
        }
    }, false);

    // 处理请求完成的事件
    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('Upload successful:', xhr.responseText);
        } else {
            console.error('Upload failed:', xhr.statusText);
        }
    };

    // 处理请求错误的事件
    xhr.onerror = function() {
        console.error('An error occurred during the upload');
    };

    // 发送请求
    xhr.open('POST', '/upload', true);
    const formData = new FormData();
    formData.append('file', file);
    xhr.send(formData);
}
使用 Fetch API

虽然Fetch API不直接支持上传进度,但我们可以通过组合使用ReadableStream来实现。以下是一个示例:

async function uploadFile(file) {
    const response = await fetch('/upload', {
        method: 'POST',
        body: file
    });

    // 不支持直接获取进度
    if (!response.ok) {
        console.error('Upload failed:', response.statusText);
        return;
    }

    console.log('Upload successful:', await response.text());
}

在Fetch API中,我们需要借助其他手段来实现进度监控。Fetch并不提供内建的进度监听能力,因此更常用的还是XMLHttpRequest

2. 监听文件下载进度

文件下载进度的监听同样可以通过XMLHttpRequest来实现。以下是如何实现下载进度监听的示例。

function downloadFile(url) {
    const xhr = new XMLHttpRequest();

    // 监听下载进度
    xhr.addEventListener("progress", function(event) {
        if (event.lengthComputable) {
            const percentComplete = (event.loaded / event.total) * 100;
            console.log(`Download progress: ${percentComplete.toFixed(2)}%`);
            // 这里可以更新进度条等UI元素
        }
    }, false);

    // 处理下载完成的事件
    xhr.onload = function() {
        if (xhr.status === 200) {
            console.log('Download successful');
            const blob = new Blob([xhr.response], { type: 'application/octet-stream' });
            const link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = 'downloaded_file'; // 自定义文件名
            link.click();
        } else {
            console.error('Download failed:', xhr.statusText);
        }
    };

    // 设置响应类型为blob以便下载
    xhr.responseType = 'blob';
    xhr.open('GET', url, true);
    xhr.send();
}

// 使用示例
downloadFile('/path/to/file');

3. 总结

  • 文件上传:可以使用XMLHttpRequestupload事件来监听上传进度,而Fetch API不直接支持上传进度监听。
  • 文件下载:可以使用XMLHttpRequestprogress事件来监听下载进度。

通过实现这些功能,用户在上传和下载文件时可以获得更加直观的反馈,从而提升整体用户体验。你可以根据实际情况调整进度反馈的方式,比如更新进度条、提示信息等。

标签:const,xhr,进度,console,上传,监听
From: https://blog.csdn.net/bollat/article/details/142906294

相关文章

  • 【vue文件上传+示例代码】【for循环展示el-teble表格】
    <template><el-rowjustify="space-between"><inputtype="file"id="fileInput"/><el-buttontype="success"@click="doSumbitFile">上传</el-button></el-row>&......
  • Qt/C++开源控件 圆形进度条
    Qt/C++开源控件圆形进度条简约风格:设计简洁,没有多余的元素,清晰地显示了当前进度。颜色对比:使用了亮色的蓝色来标示进度,与深色背景形成鲜明对比,使得进度指示一目了然。清晰的刻度:刻度线清晰,尽管没有标注所有数字,但通过较长的刻度线在50和100的位置,用户可以很容易地估计......
  • vue中上传xlsx表格文件,并获取文件json数据【前端文件上传】
    import*asXLSXfrom"xlsx";onMounted(function(){document.getElementById('fileInput').addEventListener('change',function(){constfileObj=this.files[0]//console.log(fileObj)//......
  • [Python学习日记-46] Python 中第三方开源模块的安装、使用与上传自己写的模块
    [Python学习日记-46]Python中第三方开源模块的安装、使用与上传自己写的模块简介下载与安装如何使用安装好的第三方开源模块如何上传自己写的模块到PyPi简介    在前面的模块介绍和导入当中主要介绍的都是Python内置的一些模块,我们把它称为标准库,而这个库......
  • apisix~自定义文件上传代理插件~支持form-data文件和kv参数
    参考文献https://stackoverflow.com/questions/24535189/composing-multipart-form-data-with-a-different-content-type-on-each-parts-with-jhttps://www.reddit.com/r/lua/comments/yaizxv/lua_post_multipartformdata_and_a_file_via/?rdt=60519https://github.com/rstudi......
  • Qt监听Windows锁屏、解锁、休眠、唤醒、登录、注销消息
    环境:Windows11笔记本,其它环境未测试根据其它博客的直接在窗口nativeEvent中监听WM_WTSSESSION_CHANGE会话消息和WM_POWERBROADCAST电源消息发现不起作用,查阅尝试后找到可行方法如下:会话事件和电源消息都需要先用WindowsAPI注册窗口句柄voidMainWindow::registerSys......
  • 在Java程序中监听mysql的binlog
    目录1、背景2、mysql-binlog-connector-java简介3、准备工作1、验证数据库是否开启binlog2、开启数据库的binlog3、创建具有REPLICATIONSLAVE权限的用户4、事件类型eventType解释1、TABLE_MAP的注意事项2、获取操作的列名5、监听binlog的position1、从最新的binlog位置开始监......
  • 【进阶版】如何实现一个基于 HTML+CSS+JS 的任务进度条
    创建一个动态任务进度条:进阶版实现在现代网页开发中,任务进度条是用户交互中非常重要的组件,它能够直观地展示任务的进展情况。本文将向你展示如何使用HTML、CSS和JavaScript创建一个动态的任务进度条。在这个进阶版本中,用户不仅可以通过点击进度条来更新进度,还可以手动......
  • 项目管理中进度管理工具——甘特图(Gantt Chart)
    这道题目考查的是关于项目管理中进度管理工具——甘特图(GanttChart)的知识点。甘特图是一种用于项目进度管理的条形图,它通过水平条形图来展示项目中各个任务的开始时间、结束时间和持续时间,以及任务之间的依赖关系。甘特图的主要特点和用途包括:任务时间线的可视化:甘特图可以清......
  • 使用Git将文件上传到GitHub和Gitee
    目录今天为大家带来一篇超级简单但是非常实用的Git教程,一分钟即可将文件上传到GitHub仓库(或者Gitee)中,很多教程教学的非常全面,但是我认为初学就应该使用最简单的方法,才能保证后续充满动力,更全面的学习!还请各位客官接着往下看!1.初始化目录文件夹1.找到目标文件夹(你想上传代码......