当前位置:首页 > 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.js) 使用<input type="file">元素配合<video>标签实现基础上传和预览功能: <template>…

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

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

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

vue实现图片重新上传

vue实现图片重新上传

实现图片重新上传功能 在Vue中实现图片重新上传功能,通常涉及文件选择、预览、上传和重置等步骤。以下是一个完整的实现方案: 模板部分 <template> <div>…

vue实现表格批量删除

vue实现表格批量删除

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

vue实现excel上传预览

vue实现excel上传预览

vue实现excel上传预览的方法 使用xlsx库解析Excel文件 安装xlsx库来处理Excel文件: npm install xlsx 在Vue组件中引入xlsx库: import * as…

Vue实现头像截取上传

Vue实现头像截取上传

Vue实现头像截取上传的方法 使用Vue实现头像截取上传功能,可以通过以下步骤完成。主要依赖第三方库vue-cropper或cropperjs实现图像裁剪功能,结合文件上传逻辑完成整个流程。 安装依…