当前位置:首页 > React

react实现断点续传

2026-01-27 09:48:27React

断点续传的实现原理

断点续传的核心在于将大文件分割为多个小块,上传时记录已上传的部分。当网络中断或暂停后重新上传时,只需上传未完成的部分,减少重复传输。

前端实现步骤

使用React实现断点续传需要结合文件分片、MD5校验和进度记录等技术:

react实现断点续传

文件分片处理 通过File对象的slice方法将文件切割为固定大小的块(如1MB)。使用spark-md5库计算文件唯一hash,作为断点标识:

const chunkSize = 1024 * 1024; // 1MB
const chunks = Math.ceil(file.size / chunkSize);
const spark = new SparkMD5.ArrayBuffer();

for (let i = 0; i < chunks; i++) {
  const chunk = file.slice(i * chunkSize, (i + 1) * chunkSize);
  spark.append(chunk);
}
const fileHash = spark.end();

上传状态管理 使用React的useState记录上传进度和已完成的块:

react实现断点续传

const [uploadedChunks, setUploadedChunks] = useState([]);
const [progress, setProgress] = useState(0);

分片上传控制 通过FormData发送每个分片,服务端需支持分片合并:

const uploadChunk = async (chunk, chunkIndex) => {
  const formData = new FormData();
  formData.append('chunk', chunk);
  formData.append('chunkIndex', chunkIndex);
  formData.append('fileHash', fileHash);

  await axios.post('/upload', formData, {
    onUploadProgress: (e) => {
      const percent = Math.round((e.loaded / e.total) * 100);
      setProgress(prev => prev + percent/chunks);
    }
  });
  setUploadedChunks(prev => [...prev, chunkIndex]);
};

服务端配合要点

  1. 分片存储:临时存储接收的分片,通常按文件hash建立目录
  2. 合并接口:当所有分片上传完成后触发合并操作
  3. 校验接口:上传前检查哪些分片已存在

Node.js示例代码:

app.post('/merge', async (req, res) => {
  const { fileHash, fileName } = req.body;
  const chunkDir = path.resolve('temp', fileHash);
  const chunks = await fs.readdir(chunkDir);

  chunks.sort((a, b) => a - b).forEach(chunk => {
    fs.appendFileSync(
      path.resolve('uploads', fileName),
      fs.readFileSync(path.resolve(chunkDir, chunk))
    );
    fs.unlinkSync(path.resolve(chunkDir, chunk));
  });
  fs.rmdirSync(chunkDir);
});

优化建议

  1. 使用Web Worker计算文件hash避免界面卡顿
  2. 实现并发上传控制(如最多5个并行请求)
  3. 添加暂停/恢复功能时清除未完成的axios请求
  4. 本地缓存已上传分片信息(使用localStorage)

完整流程示例

  1. 用户选择文件后计算文件hash
  2. 向服务端查询已上传的分片列表
  3. 只上传缺失的分片
  4. 全部分片上传完成后请求合并
  5. 显示最终上传结果

通过这种方式可以实现稳定可靠的断点续传功能,适合大文件上传场景。

分享给朋友:

相关文章

react如何测试

react如何测试

React 测试方法 React 应用的测试通常涉及组件测试、集成测试和端到端测试。以下是常用的测试工具和方法: Jest Jest 是 Facebook 开发的 JavaScript 测试框架,适…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实…

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Contex…