首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js 上传文件进度

在JavaScript中实现文件上传进度显示,通常涉及到HTML5的XMLHttpRequest对象或者使用Fetch API结合ReadableStream来跟踪上传进度。以下是相关基础概念及实现方式:

基础概念

  1. XMLHttpRequest: 是一个JavaScript对象,用于与服务器交换数据,支持异步请求。
  2. Progress Event: 当上传或下载进度发生变化时触发的事件。
  3. Fetch API: 是一个现代的、基于Promise的网络请求API,用于替代XMLHttpRequest。

实现文件上传进度显示的优势

  • 用户体验提升:用户可以实时看到文件上传的进度,减少等待的焦虑。
  • 错误处理:可以在上传过程中捕获错误,并及时反馈给用户。
  • 流量控制:对于大文件上传,可以更好地控制流量和资源使用。

类型

  • 基于XMLHttpRequest的进度跟踪:适用于所有现代浏览器。
  • 基于Fetch API的进度跟踪:需要浏览器支持Fetch API和ReadableStream。

应用场景

  • 文件上传功能:如图片、视频、文档等文件的上传。
  • 大文件分片上传:将大文件分成多个小片段进行上传,提高上传的成功率和效率。

实现示例

基于XMLHttpRequest的实现

代码语言:txt
复制
function uploadFile(file) {
  const xhr = new XMLHttpRequest();
  const formData = new FormData();
  formData.append('file', file);

  xhr.upload.addEventListener('progress', (event) => {
    if (event.lengthComputable) {
      const percentComplete = (event.loaded / event.total) * 100;
      console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
    }
  });

  xhr.open('POST', '/upload');
  xhr.send(formData);
}

// 使用示例
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (event) => {
  const file = event.target.files[0];
  uploadFile(file);
});

基于Fetch API的实现

代码语言:txt
复制
async function uploadFile(file) {
  const url = '/upload';
  const formData = new FormData();
  formData.append('file', file);

  const response = await fetch(url, {
    method: 'POST',
    body: formData,
    onUploadProgress: (progressEvent) => {
      if (progressEvent.lengthComputable) {
        const percentComplete = (progressEvent.loaded / progressEvent.total) * 100;
        console.log(`上传进度: ${percentComplete.toFixed(2)}%`);
      }
    }
  });

  if (response.ok) {
    console.log('文件上传成功');
  } else {
    console.error('文件上传失败');
  }
}

// 使用示例
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', (event) => {
  const file = event.target.files[0];
  uploadFile(file);
});

注意事项

  • onUploadProgress事件在标准的Fetch API中并不存在,需要使用第三方库如fetch-progress来实现进度跟踪。
  • 对于大文件上传,建议使用分片上传技术,以提高上传的成功率和效率。

解决常见问题

  1. 进度事件不触发:确保服务器端正确处理了文件上传请求,并且返回了正确的响应头。
  2. 进度计算不准确:确保event.lengthComputabletrue,并且event.totalevent.loaded的值是正确的。

通过以上方法,可以在JavaScript中实现文件上传进度的显示,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

js文件异步上传进度条

进度条的应用是为了显示的告诉用户文件上传了多少,对于小文件的上传基本上应用不到进度条。...进度条主要应用于大文件的上传,在于告诉用户上传情况,不至于让用户无状态等待,增加了用户的体验,如果没有进度条,在上传过程中,用户不知道是不是卡死了,这种体验就很差了,下面我们来说一下如何在异步上传时显示进度条...其实无论是原生js写xhr,还是jq的ajax,还是axios的异步都提供了一个获取上传进度的API,首先我们来看一下原生js如何获取上传进度。...原生js获取上传进度 var fd = new FormData(); fd.append("file", document.getElementById('testFile').files[0]);...; } }); axios获取上传进度 在axios中提供了一个参数onUploadProgress,有了这个参数就可以很方便的获取上传进度了,其方法实现还是和原生js的一样,这个参数其实就是注册一个监听事件

10K20
  • spring boot 用js实现上传文件(包含其他字段)显示进度

    1、由于我使用了框架内置对象处理二进制文件信息,所有接收过程完全被封闭在框架内置对象中,直到请求结束才返回信息提示,上传的过程进度无法访问。...我使用了js,不通过form表单action跳转后台上传。 (1)html内容如下;测试期间只需要关注那几个上传的字段和按钮·就好了,我们在js中只需要用到字段id获得信息,通过js上传。...-- /.col --> (2)导入封装的js文件,内容如下:需要根据需要进行调整和修改上传成功和失败后自定义的操作以及参数内容,后面会提到。代码意思自行理解。...代码如下: /** * 上传文件公共组件 * * @param url 上传地址 * @param processBar 进度条 jquery获取的页面组件 * @param speedLab...--页面独有的js--> var i=[[${i}]]; if(i==1){ alert("上传成功!")

    1.9K20

    Java 单文件、多文件上传 实现上传进度条

    博客地址:https://ainyi.com/76 日常,工作 在这里总结一下上传吧(是以前做过的练习,就汇总到个人博客吧) java ssm 框架实现文件上传 实现:单文件上传、多文件上传(单选和多选...),并且用 ajax 异步刷新,在当前界面显示上传的文件 后端 首先 springmvc 的配置文件要配置上传文件解析器: <!...,返回相关数据到页面 return UploadUtil.mutlUpload(file, request); } } 进度条 要显示上传进度条,我这里采用原生 ajax 方法...data+")"); krry_uploadsuccess(jdata); } }; // 监听文件上传的进度 xhr.upload.addEventListener("progress...; if (prograssbarDom && event.lengthComputable) { let percent = event.loaded / event.total; //文件上传进度百分比

    7K30

    js文件分片上传

    写在前面 今天我们写一下关于js的分片上传,因为工作中很多时候上传文件是比较大的,为了不让卡死,我们可以使用分片上传的方式进行文件的传输,下面就简单的将思路梳理一下,然后贴上代码 思路分析 既然是分片上传...,也就是说,假设一个文件的大小是10Mb,我们将其分为十份,每一份都按照前面所的完整的上传过程进行上传,然后循环十次即可将全部的都上传结束,这是我们的基本思路,下面我们贴上代码分析一下 源代码实现...fragmentAtionUpload 分片上传 * @params file 上传的文件 * @params cbUrl 上传的回调函数 * @params size 分片的大小...,url和分片的大小,回调函数就做一件事,就是上传,他不管上传的大小,所以我们在循环的时候反复调用这个函数即可,最后是文件操作的函数就不多说了,总体来说最基本的分片上传还是比较简单的。...问题分析 这里有一个比较致命的问题,就是因为是分片上传,所以文件是被切成了一段一段的,那么就意味着如果上传的过程中因为网络或者别的原因中断了,那么问题就比较严重了,你可以选择重新上传,但是因为前面的一些片段已经上传上去了

    7.6K20

    HTML5矢量实现文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传、上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条...,矢量在《矢量Chart图表嵌入HTML5网络拓扑图的应用》一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条...从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示当前上传进度。 那么接下来我们就来探讨下具体实现: 首先,我们来分析下进度条的结构: 1. 需要一个背景,background 2....那么接下来我们来模拟文件上传进度,让进度条动起来。...至此,进度条的设计就结束了,那么接下来就来看下进度条如何与文件上传结合起来: 1.

    2.4K80

    js 大文件上传的思路

    bug收集:专门解决与收集bug的网站 网址:www.bugshouji.com 今日分享:JS 上传大文件的解决思路 1....文件切片 把一个大文件转换成二进制内容,然后按照一个固定的大小对二进制内容进行切割,得到多个小文件,然后循环上传所有的小文件。...在js中,文件File对象是Blob对象的子类,可以使用 slice() 方法完成对文件的切割; 获取文件对象( e.target.files[0]) // 选中的文件 var file = null...文件合并 当所有小文件上传完成,调用接口通知后端把所有的文件按编号进行合并,组成大文件; if (list.length === 0) { //所有任务完成,合并切片 await...断点续传 把所有上传失败的小文件加入一个数组里面,在所有小文件都上传结束(成功和失败都算结束)之后再上传一次上传失败了的小文件,反复执行这一步,直到所有小文件都上传成功,可以通过递归实现。

    7K30

    HTML5矢量实现文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传、上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条...,矢量在《矢量Chart图表嵌入HTML5网络拓扑图的应用》一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条...从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示当前上传进度。 那么接下来我们就来探讨下具体实现: 首先,我们来分析下进度条的结构: 1. 需要一个背景,background 2....那么接下来我们来模拟文件上传进度,让进度条动起来。...至此,进度条的设计就结束了,那么接下来就来看下进度条如何与文件上传结合起来: 1.

    2.6K40

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券