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

如何在React中实现本地文件上传至浏览器时显示进度条及上传百分比

文件上传百分比获取方案

你需要借助XMLHttpRequest的上传进度监听能力,结合React状态存储进度值,即可实现进度展示,具体实现步骤如下:

  • 新增两个状态:selectedFile 存储用户选中的文件,uploadPercent 存储实时上传百分比
  • 给文件选择框绑定onChange事件,记录用户选中的文件
  • 在提交逻辑中使用XHR发起上传请求,监听upload对象的progress事件,实时计算并更新进度
  • 在视图层渲染进度值或进度条

完整实现代码如下:

import { useState } from 'react';

export default function App() {
  const [selectedFile, setSelectedFile] = useState(null);
  const [uploadPercent, setUploadPercent] = useState(0);

  const handleFileChange = (e) => {
    setSelectedFile(e.target.files[0]);
    // 每次选择新文件时重置进度
    setUploadPercent(0);
  };

  const handleSubmit = (e) => {
    e.preventDefault();
    if (!selectedFile) return alert('请先选择文件');

    const formData = new FormData();
    formData.append('uploadFile', selectedFile);

    const xhr = new XMLHttpRequest();
    // 替换为实际的后端上传接口地址
    xhr.open('POST', '/your/upload/api');

    // 监听上传进度事件
    xhr.upload.addEventListener('progress', (e) => {
      if (e.lengthComputable) {
        const percent = Math.round((e.loaded / e.total) * 100);
        setUploadPercent(percent);
      }
    });

    // 上传完成回调可根据业务需求自行扩展
    xhr.addEventListener('load', () => {
      if (xhr.status >= 200 && xhr.status < 300) {
        console.log('上传成功');
      } else {
        console.log('上传失败');
      }
    });

    xhr.addEventListener('error', () => {
      console.log('上传发生网络错误');
    });

    xhr.send(formData);
  };

  return (
    <div className="App">
      <form onSubmit={handleSubmit}>
        <input type="file" onChange={handleFileChange} />
        <input type="submit" value="click to submit" />
        {/* 展示上传进度 */}
        {uploadPercent > 0 && (
          <div>上传进度:{uploadPercent}%</div>
        )}
      </form>
    </div>
  );
}

注意:如果后端接口存在跨域限制,需要后端配置CORS规则允许你的前端域名访问,否则上传请求会被浏览器拦截。
如果偏好使用Fetch API实现,也可以通过监听响应体的可读流进度计算上传百分比,不过该方案兼容性稍弱,常规业务场景下优先使用XHR的实现即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:04