当前位置:首页 > VUE

vue实现列表批量上传

2026-02-21 08:02:14VUE

实现列表批量上传功能

在Vue中实现列表批量上传功能,通常需要结合文件选择、预览、上传进度显示等环节。以下是实现方法:

文件选择与多选处理

使用HTML的input元素设置multiple属性,允许用户选择多个文件:

<input type="file" multiple @change="handleFileChange">

在Vue组件中处理文件选择事件:

data() {
  return {
    fileList: []
  }
},
methods: {
  handleFileChange(e) {
    this.fileList = Array.from(e.target.files)
  }
}

文件预览与列表展示

在模板中展示已选择的文件列表:

<ul>
  <li v-for="(file, index) in fileList" :key="index">
    {{ file.name }} - {{ formatSize(file.size) }}
    <button @click="removeFile(index)">删除</button>
  </li>
</ul>

添加辅助方法格式化文件大小:

methods: {
  formatSize(bytes) {
    if (bytes === 0) return '0 Bytes'
    const k = 1024
    const sizes = ['Bytes', 'KB', 'MB', 'GB']
    const i = Math.floor(Math.log(bytes) / Math.log(k))
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
  },
  removeFile(index) {
    this.fileList.splice(index, 1)
  }
}

批量上传实现

使用axios或fetch API实现批量上传,可以配合FormData:

methods: {
  async uploadFiles() {
    if (this.fileList.length === 0) return

    const formData = new FormData()
    this.fileList.forEach(file => {
      formData.append('files[]', file)
    })

    try {
      const response = await axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          const percentCompleted = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          )
          console.log(percentCompleted)
        }
      })
      console.log('上传成功', response.data)
    } catch (error) {
      console.error('上传失败', error)
    }
  }
}

进度显示优化

添加进度条组件显示上传进度:

<progress :value="progress" max="100"></progress>
<span>{{ progress }}%</span>

在data中添加progress属性,并在上传方法中更新:

data() {
  return {
    progress: 0
  }
},
methods: {
  async uploadFiles() {
    // ...
    onUploadProgress: progressEvent => {
      this.progress = Math.round(
        (progressEvent.loaded * 100) / progressEvent.total
      )
    }
    // ...
  }
}

断点续传支持(高级)

对于大文件,可以实现分片上传:

vue实现列表批量上传

const CHUNK_SIZE = 5 * 1024 * 1024 // 5MB

async uploadChunks(file) {
  const chunks = Math.ceil(file.size / CHUNK_SIZE)
  for (let i = 0; i < chunks; i++) {
    const start = i * CHUNK_SIZE
    const end = Math.min(start + CHUNK_SIZE, file.size)
    const chunk = file.slice(start, end)

    const formData = new FormData()
    formData.append('chunk', chunk)
    formData.append('chunkIndex', i)
    formData.append('totalChunks', chunks)
    formData.append('fileId', file.uniqueId)

    await axios.post('/api/upload-chunk', formData)
  }
}

注意事项

  1. 服务器端需要支持多文件接收处理
  2. 对于大文件上传应考虑分片上传或断点续传
  3. 前端应添加文件类型和大小限制
  4. 上传过程中应禁用提交按钮防止重复提交
  5. 添加适当的错误处理和用户反馈

标签: 批量上传
分享给朋友:

相关文章

vue实现上传

vue实现上传

Vue 实现文件上传 在 Vue 中实现文件上传功能可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的数据绑定和事件处理来实现。以下是几种常见的实现…

vue上传视频实现

vue上传视频实现

使用 <input type="file"> 上传视频 创建文件选择控件,限制文件类型为视频格式(如 .mp4, .webm)。通过 @change 事件监听文件选择,获取 File 对象…

vue 实现批量关注

vue 实现批量关注

实现批量关注功能 在Vue中实现批量关注功能通常涉及前端界面交互、API调用和状态管理。以下是实现该功能的关键步骤: 界面设计与交互 创建多选框或选择列表供用户批量选择关注对象 <templ…

vue 怎么实现上传

vue 怎么实现上传

Vue 实现文件上传的方法 使用原生 HTML5 文件上传 通过 <input type="file"> 元素结合 Vue 的数据绑定实现基础文件上传功能。 <template&g…

vue实现上传按钮

vue实现上传按钮

Vue 实现上传按钮的方法 使用原生 HTML input 和 Vue 处理 通过 HTML 的 input 元素结合 Vue 的事件处理实现文件上传功能。 <template> &…

vue实现批量选择li怎么实现

vue实现批量选择li怎么实现

Vue 实现批量选择列表项的方法 在 Vue 中实现批量选择列表项(<li>)通常涉及数据绑定、事件处理和状态管理。以下是几种常见的实现方式: 方法一:基于 v-model 和复选框 通…