You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XHR Progress的作用是什么?数据会被缓存吗?及文件上传进度条实现疑问

文件上传带进度条:XHR流程、后台逻辑及常见疑问解答

嘿,我来帮你把这些问题理清楚,一步步拆解哈~

一、先梳理你的前端XHR上传流程

你现在的Ajax代码方向是对的,我把你贴的代码补全并解释关键细节:

$.ajax({
  type: "POST",
  url: '/Home/UploadHomeReport',
  contentType: false, // 必须设为false,让浏览器自动处理文件上传的请求头(multipart/form-data),不用手动搞复杂的边界符
  processData: false, // 禁止jQuery自动处理数据,不然会把FormData转成字符串,文件就传坏了
  data: data, // 这里的data得是你构造的FormData对象,比如`new FormData($('#your-upload-form')[0])`,用来包装要上传的文件
  success: function (result) {
    // 上传成功后的回调,比如提示用户或者刷新页面
  },
  xhr: function () {
    const xhr = new window.XMLHttpRequest();
    // 关键!监听上传进度事件,这是实现进度条的核心
    xhr.upload.addEventListener('progress', function(e) {
      if (e.lengthComputable) {
        // 计算上传进度百分比
        const percentComplete = (e.loaded / e.total) * 100;
        // 这里就可以更新你的进度条啦,比如给进度条元素设置宽度
        // $('.progress-bar').css('width', `${Math.round(percentComplete)}%`)
        console.log(`当前上传进度:${Math.round(percentComplete)}%`);
      }
    });
    return xhr;
  }
});

这个流程的核心逻辑是:

  • 用FormData包装文件,它能正确处理二进制文件数据,适配文件上传的请求格式
  • 通过xhr.upload的progress事件,实时获取上传的字节数占比,从而更新进度条

二、后台(以ASP.NET MVC为例,匹配你的接口路径)处理逻辑要点

后台需要接收前端发来的FormData,解析出文件后保存或处理,给你个基础示例:

[HttpPost]
public ActionResult UploadHomeReport()
{
    try
    {
        // 获取上传的文件,这里的"file"要和你前端FormData里append的key对应
        var uploadedFile = Request.Files["file"]; 
        if (uploadedFile != null && uploadedFile.ContentLength > 0)
        {
            // 定义服务器上的保存路径,比如App_Data下的Uploads文件夹
            var saveDirectory = Server.MapPath("~/App_Data/Uploads/");
            // 如果目录不存在,先创建
            if (!Directory.Exists(saveDirectory))
            {
                Directory.CreateDirectory(saveDirectory);
            }
            // 可以用原文件名,也可以重命名避免重复(比如加时间戳)
            var fileName = Path.GetFileName(uploadedFile.FileName);
            uploadedFile.SaveAs(Path.Combine(saveDirectory, fileName));
            
            return Json(new { success = true, message = "文件上传成功!" });
        }
        return Json(new { success = false, message = "请选择要上传的文件" });
    }
    catch (Exception ex)
    {
        return Json(new { success = false, message = $"上传失败:{ex.Message}" });
    }
}

注意事项:

  • 如果要传大文件,得在web.config里配置最大请求长度,比如设置maxRequestLength和maxAllowedContentLength
  • 要是用其他后端语言(Node.js、Java等),核心逻辑都是:接收multipart/form-data类型的请求,解析文件流,写入服务器存储

三、你的两个疑问解答

1. XHR Progress的作用是什么?

xhr.upload.progress是XMLHttpRequest专门给上传过程提供的进度监听事件,核心作用就是实时告诉你当前已经传了多少数据,占总数据量的比例。

简单说,就是让你能在前端做进度条,给用户直观的反馈——比如上传大文件时,用户能看到进度在走,就不会以为页面卡住了。它的触发逻辑是:浏览器在向服务器发数据的过程中,会每隔一小段时间触发一次这个事件,事件对象里的loaded是已上传字节数,total是总字节数(只有当服务器能返回文件总长度时,lengthComputable才会是true)。

2. 上传的数据会被缓存吗?

完全不会。原因有两个:

  • 你用的是POST请求上传文件,浏览器默认不会缓存POST请求的内容,因为POST一般是用来提交数据、修改服务器状态的,缓存没有意义
  • 从XHR的上传机制来说,文件是流式实时发送到服务器的,不会被浏览器存起来重复发送,除非你自己额外做了缓存逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:26:25