当前位置:首页 > 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)
  }
}

文件预览与列表展示

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

vue实现列表批量上传

<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:

vue实现列表批量上传

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
      )
    }
    // ...
  }
}

断点续传支持(高级)

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

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实现分段上传

实现分段上传的基本思路 分段上传(分片上传)是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能提高上传稳定性、支持断点续传,并减轻服务器压力。 前端实现步骤 安装依赖 需要axi…

vue实现批量删除

vue实现批量删除

实现批量删除功能 在Vue中实现批量删除通常需要结合表格多选功能和API调用。以下是一个完整的实现方案: 表格多选功能实现 使用Element UI的表格组件实现多选功能: <tem…

vue实现切片上传

vue实现切片上传

切片上传的实现原理 切片上传是将大文件分割成多个小块(切片)分别上传,最后在服务端合并。这种方式能提高上传效率、支持断点续传和并发上传。 前端实现步骤 使用Vue实现切片上传需要借助File对象…

VUE如何实现批量翻译

VUE如何实现批量翻译

批量翻译的实现方法 在Vue中实现批量翻译可以通过集成第三方翻译API(如Google Translate API、百度翻译API等)或使用本地化工具(如i18n)来完成。以下是几种常见的方法:…

vue实现图片压缩上传

vue实现图片压缩上传

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

vue实现表格批量删除

vue实现表格批量删除

Vue实现表格批量删除功能 核心思路:通过复选框选择多条数据,调用接口批量删除,并更新本地数据。 数据准备与表格渲染 在Vue组件中定义表格数据和选中项的数组: data() { retu…