当前位置:首页 > VUE

vue实现分段上传

2026-03-28 06:20:16VUE

分段上传的实现原理

分段上传(Chunked Upload)是将大文件分割成多个小块分别上传,最后在服务端合并的技术。这种方式能有效解决大文件上传超时、网络不稳定等问题,同时支持断点续传和进度显示。

前端实现步骤

安装必要的依赖库(如axios):

npm install axios

创建文件分片函数:

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

上传组件示例:

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

<script>
import axios from 'axios'

export default {
  data() {
    return {
      file: null,
      progress: 0
    }
  },
  methods: {
    handleFileChange(e) {
      this.file = e.target.files[0]
    },
    async uploadFile() {
      if (!this.file) return

      const chunks = createFileChunks(this.file)
      const total = chunks.length
      const uploads = chunks.map((chunk, index) => {
        const formData = new FormData()
        formData.append('file', chunk.file)
        formData.append('filename', chunk.filename)
        formData.append('chunkIndex', index)
        formData.append('totalChunks', total)

        return axios.post('/upload', formData, {
          onUploadProgress: (progressEvent) => {
            const percent = Math.round(
              (progressEvent.loaded / progressEvent.total) * 100
            )
            this.progress = Math.min(
              100,
              ((index * 100) + percent) / total
            )
          }
        })
      })

      await Promise.all(uploads)
      await axios.post('/merge', {
        filename: this.file.name,
        totalChunks: total
      })
    }
  }
}
</script>

服务端处理要点

Node.js 示例(使用Express):

const express = require('express')
const multer = require('multer')
const fs = require('fs')
const path = require('path')

const app = express()
const upload = multer({ dest: 'temp/' })

app.post('/upload', upload.single('file'), (req, res) => {
  const { filename, chunkIndex } = req.body
  const tempPath = path.join('temp', `${filename}-${chunkIndex}`)
  fs.renameSync(req.file.path, tempPath)
  res.send({ success: true })
})

app.post('/merge', (req, res) => {
  const { filename, totalChunks } = req.body
  const writeStream = fs.createWriteStream(`uploads/${filename}`)

  for (let i = 0; i < totalChunks; i++) {
    const chunkPath = path.join('temp', `${filename}-${i}`)
    const chunk = fs.readFileSync(chunkPath)
    writeStream.write(chunk)
    fs.unlinkSync(chunkPath)
  }

  writeStream.end()
  res.send({ success: true })
})

app.listen(3000)

优化建议

实现文件哈希校验可以在分片前计算文件唯一标识,避免重复上传。使用Web Worker处理大文件计算防止UI阻塞。

添加断点续传功能需要服务端支持查询已上传分片,前端根据返回结果跳过已上传部分。典型做法是在分片上传前先发送查询请求。

vue实现分段上传

进度显示优化可以考虑分片进度和整体进度分开显示,使用更直观的进度条组件替代简单百分比。

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

相关文章

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <template>…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue实现xterm

vue实现xterm

在 Vue 中集成 Xterm.js Xterm.js 是一个基于 TypeScript 的前端终端组件库,可用于在浏览器中实现终端功能。以下是在 Vue 项目中集成 Xterm.js 的详细步骤。…

vue遮罩实现

vue遮罩实现

实现 Vue 遮罩的常见方法 使用 CSS 定位和透明度 创建一个全屏遮罩层,通过 CSS 固定定位覆盖整个视口,并设置半透明背景色。 <template> <div cl…