当前位置:首页 > VUE

vue实现大文件上传

2026-02-25 07:16:42VUE

大文件上传的实现思路

大文件上传通常涉及分片上传、断点续传和文件校验等关键技术。Vue作为前端框架,需结合后端API实现完整流程。

前端分片上传实现

使用File对象的slice方法将文件切割为多个小块,每块单独上传:

// 文件分片函数
function createFileChunks(file, chunkSize = 5 * 1024 * 1024) {
  const chunks = []
  let cur = 0
  while (cur < file.size) {
    chunks.push(file.slice(cur, cur + chunkSize))
    cur += chunkSize
  }
  return chunks
}

上传进度跟踪

通过axios的onUploadProgress事件监听上传进度:

axios.post('/upload', formData, {
  onUploadProgress: progressEvent => {
    const percent = Math.round(
      (progressEvent.loaded / progressEvent.total) * 100
    )
    console.log(`上传进度: ${percent}%`)
  }
})

断点续传实现

前端需要记录已上传的分片信息,通常使用localStorage或服务端返回的记录:

// 检查已上传分片
async function checkUploadedChunks(fileHash) {
  const { data } = await axios.get('/check-upload', {
    params: { fileHash }
  })
  return data.uploadedChunks || []
}

文件完整性校验

上传完成后需要发送文件hash进行最终校验:

// 生成文件hash(使用spark-md5库)
function generateFileHash(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)
  })
}

完整上传流程示例

async function uploadLargeFile(file) {
  const fileHash = await generateFileHash(file)
  const chunks = createFileChunks(file)
  const uploadedChunks = await checkUploadedChunks(fileHash)

  for (let i = 0; i < chunks.length; i++) {
    if (uploadedChunks.includes(i)) continue

    const formData = new FormData()
    formData.append('chunk', chunks[i])
    formData.append('hash', fileHash)
    formData.append('index', i)

    await axios.post('/upload-chunk', formData, {
      onUploadProgress: e => updateProgress(i, e)
    })
  }

  await axios.post('/merge', { 
    fileName: file.name,
    fileHash,
    chunkCount: chunks.length 
  })
}

后端接口设计要求

后端需要实现三个核心接口:

  • /check-upload:检查已上传分片
  • /upload-chunk:接收单个分片
  • /merge:合并所有分片

性能优化建议

使用Web Worker计算文件hash避免界面卡顿:

// worker.js
self.importScripts('spark-md5.min.js')

self.onmessage = function(e) {
  const spark = new self.SparkMD5.ArrayBuffer()
  const file = e.data

  const reader = new FileReader()
  reader.onload = function(e) {
    spark.append(e.target.result)
    self.postMessage(spark.end())
  }
  reader.readAsArrayBuffer(file)
}

错误处理机制

实现上传失败自动重试机制:

async function uploadWithRetry(formData, retries = 3) {
  try {
    return await axios.post('/upload-chunk', formData)
  } catch (error) {
    if (retries <= 0) throw error
    return uploadWithRetry(formData, retries - 1)
  }
}

界面展示优化

使用Element UI的Progress组件展示上传进度:

vue实现大文件上传

<el-progress 
  :percentage="uploadPercent" 
  :status="uploadStatus"
/>

注意事项

  1. 分片大小建议2-5MB,过小会增加请求次数,过大可能触发超时
  2. 文件hash生成比较耗时,务必使用Web Worker
  3. 清理上传失败的临时文件
  4. 考虑添加上传暂停/继续功能
  5. 对敏感文件进行内容安全检查

标签: 大文件上传
分享给朋友:

相关文章

vue实现语音上传

vue实现语音上传

实现语音上传功能 在Vue中实现语音上传功能需要结合浏览器的Web Audio API和文件上传逻辑。以下是一个完整的实现方案: 录音功能实现 安装依赖库recorder-core和wav编码器:…

vue实现上传头像显示

vue实现上传头像显示

Vue 实现上传头像并显示 前端实现(Vue 3 + Element Plus) 模板部分 <template> <div class="avatar-upload">…

vue大文件下载实现

vue大文件下载实现

分片下载实现大文件下载 使用axios配合Blob对象实现分片下载,避免一次性加载大文件导致内存溢出。通过设置responseType: 'blob'和Range请求头实现分片: async fun…

vue上传文档怎么实现

vue上传文档怎么实现

使用原生 <input type="file"> 实现上传 在 Vue 模板中添加一个文件输入框,绑定 change 事件处理文件选择: <input type="file" @c…

react实现上传

react实现上传

React 实现文件上传 在 React 中实现文件上传功能通常涉及以下几个关键步骤: 创建文件输入组件 使用 <input type="file"> 元素创建文件选择器,通过 onCh…

react实现头像上传

react实现头像上传

实现头像上传功能 使用React实现头像上传功能需要结合文件输入、图片预览和上传逻辑。以下是一个完整的实现方案: 创建上传组件 创建一个React组件来处理头像上传功能,包含文件选择和预览功能:…