当前位置:首页 > VUE

断点续传实现vue

2026-02-22 12:15:49VUE

断点续传的实现原理

断点续传的核心在于将大文件分割为多个小块,上传时记录已上传的部分。若上传中断,再次上传时跳过已完成的块,仅上传未完成的部分。前端需配合后端接口实现分块上传、校验和合并。

前端实现步骤

文件分块处理 使用File对象的slice方法将文件切割为固定大小的块(如1MB):

function createFileChunks(file, chunkSize = 1024 * 1024) {
  const chunks = []
  let cur = 0
  while (cur < file.size) {
    chunks.push(file.slice(cur, cur + chunkSize))
    cur += chunkSize
  }
  return chunks
}

计算文件哈希值 使用SparkMD5等库生成文件唯一标识,用于服务端校验:

断点续传实现vue

import SparkMD5 from 'spark-md5'
function calculateHash(file) {
  return new Promise(resolve => {
    const spark = new SparkMD5.ArrayBuffer()
    const reader = new FileReader()
    reader.onload = e => {
      spark.append(e.target.result)
      resolve(spark.end())
    }
    reader.readAsArrayBuffer(file)
  })
}

上传控制逻辑 通过axios发送分块,记录成功上传的块索引:

async function uploadChunks(chunks, hash) {
  const uploadedList = await checkServerChunks(hash) // 查询已上传的块
  const requests = chunks.map((chunk, index) => {
    if (uploadedList.includes(index)) return Promise.resolve()
    const formData = new FormData()
    formData.append('chunk', chunk)
    formData.append('hash', hash)
    formData.append('index', index)
    return axios.post('/upload', formData)
  })
  await Promise.all(requests)
  await mergeRequest(hash) // 通知服务端合并文件
}

服务端配合要点

接口设计

断点续传实现vue

  • POST /check-chunks:接收文件哈希,返回已上传的块索引列表
  • POST /upload:接收分块数据、哈希值和索引
  • POST /merge:触发文件合并操作

目录结构示例

temp_uploads/
  ├── {fileHash}_0.chunk
  ├── {fileHash}_1.chunk
uploads/
  ├── merged_files

进度显示实现

使用axiosonUploadProgress回调更新进度:

const progress = ref(0)
axios.post('/upload', formData, {
  onUploadProgress: e => {
    progress.value = Math.round((e.loaded / e.total) * 100)
  }
})

完整组件示例

<template>
  <input type="file" @change="handleFileChange">
  <button @click="handleUpload">上传</button>
  <div>进度: {{ progress }}%</div>
</template>

<script setup>
import { ref } from 'vue'
import axios from 'axios'

const file = ref(null)
const progress = ref(0)

const handleFileChange = (e) => {
  file.value = e.target.files[0]
}

const handleUpload = async () => {
  if (!file.value) return
  const chunks = createFileChunks(file.value)
  const hash = await calculateHash(file.value)
  await uploadChunks(chunks, hash)
}
</script>

注意事项

  1. 分块大小需根据网络环境调整,通常1MB-5MB
  2. 服务端需要实现临时文件清理机制
  3. 文件哈希计算可能耗时,建议使用Web Worker
  4. 并发上传数需限制,避免浏览器崩溃

标签: 断点续传vue
分享给朋友:

相关文章

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例:…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ dat…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件:…

vue实现 页面

vue实现 页面

Vue 实现页面的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 是官方脚手架工具,适合传统项目;Vite 提供更快的现代构建体验。 npm cre…

vue导航实现

vue导航实现

Vue 导航实现方法 在 Vue 中实现导航功能通常涉及路由配置、组件设计和状态管理。以下是几种常见的实现方式: 使用 Vue Router 实现基础导航 安装 Vue Router: npm i…