当前位置:首页 > React

react实现断点续传

2026-01-27 09:48:27React

断点续传的实现原理

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

前端实现步骤

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

文件分片处理 通过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记录上传进度和已完成的块:

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示例代码:

react实现断点续传

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 开发基础步骤 安装 Node.js 和 npm/yarn 确保系统已安装 Node.js(包含 npm)或 Yarn。React 项目依赖这些工具管理包和运行脚本。官方推荐使用 Node.…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Creat…

react如何减少setState

react如何减少setState

减少 React 中 setState 调用的方法 合并多次状态更新 使用函数式更新方式合并多次 setState 调用。React 会将多次状态更新批量处理,避免不必要的重新渲染。 // 非函…

vscode如何配置react

vscode如何配置react

配置 VSCode 进行 React 开发 安装必要插件 ES7+ React/Redux/React-Native snippets:提供 React 代码片段快速生成功能。 Prettier -…