当前位置:首页 > React

react实现视频分片上传

2026-01-27 11:49:57React

实现视频分片上传的基本思路

视频分片上传的核心是将大文件切割为多个小块(chunk),分别上传到服务器,最后由服务器合并。这种方法能提高上传稳定性、支持断点续传,并减少网络波动的影响。

前端实现步骤

文件分片处理 使用File对象的slice方法对视频文件进行分片。分片大小通常根据网络状况调整(如1MB或5MB)。

const chunkSize = 1024 * 1024; // 1MB
const chunks = [];
let start = 0;
while (start < file.size) {
  const chunk = file.slice(start, start + chunkSize);
  chunks.push(chunk);
  start += chunkSize;
}

上传分片 通过FormData将分片和元数据(如分片序号、文件哈希等)发送到服务器。建议使用并发控制(如Promise.allSettled)管理并行上传。

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

  return axios.post('/upload/chunk', formData, {
    headers: { 'Content-Type': 'multipart/form-data' }
  });
};

文件哈希生成 为每个文件生成唯一标识(如MD5),用于服务器校验和合并分片。可使用spark-md5库计算文件哈希。

import SparkMD5 from 'spark-md5';

const calculateHash = (file) => {
  return new Promise((resolve) => {
    const spark = new SparkMD5.ArrayBuffer();
    const reader = new FileReader();
    reader.readAsArrayBuffer(file);
    reader.onload = (e) => {
      spark.append(e.target.result);
      resolve(spark.end());
    };
  });
};

合并请求 全部分片上传完成后,发送合并请求通知服务器。

const mergeChunks = async (fileName, fileHash, chunkCount) => {
  return axios.post('/upload/merge', {
    fileName,
    fileHash,
    chunkCount
  });
};

后端实现要点

分片接收接口 接收分片并临时存储,需校验分片序号和文件哈希。

app.post('/upload/chunk', (req, res) => {
  const { index, hash } = req.body;
  const chunk = req.files.chunk;
  fs.writeFileSync(`temp/${hash}-${index}`, chunk.data);
  res.send({ success: true });
});

合并分片接口 按序号读取所有分片,合并为完整文件。

app.post('/upload/merge', (req, res) => {
  const { fileName, fileHash, chunkCount } = req.body;
  const writeStream = fs.createWriteStream(`uploads/${fileName}`);

  for (let i = 0; i < chunkCount; i++) {
    const chunkPath = `temp/${fileHash}-${i}`;
    writeStream.write(fs.readFileSync(chunkPath));
    fs.unlinkSync(chunkPath); // 删除临时分片
  }
  writeStream.end();
  res.send({ success: true });
});

优化与扩展

进度显示 通过axiosonUploadProgress回调更新上传进度。

{
  onUploadProgress: progressEvent => {
    const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100);
    console.log(`进度: ${percent}%`);
  }
}

断点续传 服务器记录已上传分片,前端上传前先查询缺失的分片。

错误重试 为每个分片上传添加重试机制,例如使用retry-axios库。

react实现视频分片上传

注意事项

  • 分片大小需权衡网络环境和服务器性能。
  • 文件哈希建议使用Web Worker避免阻塞主线程。
  • 临时分片需定期清理,防止磁盘空间占用。

通过以上方法,可实现稳定可靠的视频分片上传功能。实际开发中可根据需求调整分片策略和并发控制参数。

标签: 分片上传
分享给朋友:

相关文章

vue实现上传头像

vue实现上传头像

使用 Vue 实现上传头像 前端实现 创建一个文件上传组件,使用 <input type="file"> 元素选择文件,并通过 FileReader 预览图片。 <template…

vue实现上传封面

vue实现上传封面

Vue 实现上传封面功能 使用原生 input 文件上传 在 Vue 中可以通过原生 HTML 的 input 元素实现文件上传功能。创建一个文件输入框,监听 change 事件获取用户选择的文件。…

vue实现音乐上传

vue实现音乐上传

Vue 实现音乐上传功能 音乐上传功能通常涉及前端界面交互、文件选择、上传进度显示以及后端接口对接。以下是基于 Vue 的实现方法: 前端界面设计 使用 Vue 的模板语法创建一个简单的上传界面,包…

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…

vue java实现分片上传

vue java实现分片上传

分片上传的实现原理 分片上传是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能解决大文件上传超时、网络不稳定等问题,同时支持断点续传。 前端Vue实现 前端需要使用File API…

vue实现图片压缩上传

vue实现图片压缩上传

实现图片压缩上传的方法 使用HTML5的Canvas进行压缩 通过Canvas的drawImage和toDataURL方法实现图片压缩。创建一个input元素用于选择图片,监听change事件处理压缩…