当前位置:首页 > VUE

vue实现多文件上传

2026-01-23 07:17:28VUE

使用 Vue 实现多文件上传

使用原生 HTML5 文件上传

创建一个包含 input 元素的组件,设置 multiple 属性以支持多文件选择:

<template>
  <div>
    <input type="file" multiple @change="handleFileChange" />
    <button @click="uploadFiles">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    }
  },
  methods: {
    handleFileChange(event) {
      this.files = Array.from(event.target.files)
    },
    uploadFiles() {
      const formData = new FormData()
      this.files.forEach(file => {
        formData.append('files', file)
      })

      // 使用 axios 或其他 HTTP 客户端上传
      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      }).then(response => {
        console.log('上传成功', response)
      })
    }
  }
}
</script>

使用第三方库 vue-upload-component

安装 vue-upload-component:

npm install vue-upload-component

在组件中使用:

<template>
  <div>
    <file-upload
      multiple
      :maximum="10"
      @input="handleFiles"
      :headers="{'X-CSRF-TOKEN': token}"
      :url="'/api/upload'"
    ></file-upload>
  </div>
</template>

<script>
import FileUpload from 'vue-upload-component'
export default {
  components: {
    FileUpload
  },
  data() {
    return {
      token: document.querySelector('meta[name="csrf-token"]').content
    }
  },
  methods: {
    handleFiles(files) {
      console.log('已选择文件', files)
    }
  }
}
</script>

实现拖拽上传

添加拖拽区域和事件处理:

<template>
  <div 
    class="drop-zone"
    @dragover.prevent="dragover"
    @dragleave.prevent="dragleave"
    @drop.prevent="drop"
  >
    <p>拖拽文件到此处上传</p>
    <input type="file" multiple @change="handleFileChange" />
  </div>
</template>

<script>
export default {
  methods: {
    dragover(event) {
      event.currentTarget.classList.add('dragover')
    },
    dragleave(event) {
      event.currentTarget.classList.remove('dragover')
    },
    drop(event) {
      event.currentTarget.classList.remove('dragover')
      this.files = Array.from(event.dataTransfer.files)
    }
  }
}
</script>

<style>
.drop-zone {
  border: 2px dashed #ccc;
  padding: 20px;
  text-align: center;
}
.drop-zone.dragover {
  border-color: #42b983;
}
</style>

上传进度显示

使用 axios 的 onUploadProgress 回调显示上传进度:

<template>
  <div>
    <input type="file" multiple @change="handleFileChange" />
    <button @click="uploadFiles">上传</button>
    <div v-if="progress > 0">
      上传进度: {{ progress }}%
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      progress: 0
    }
  },
  methods: {
    uploadFiles() {
      const formData = new FormData()
      this.files.forEach(file => {
        formData.append('files', file)
      })

      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        onUploadProgress: progressEvent => {
          this.progress = Math.round(
            (progressEvent.loaded * 100) / progressEvent.total
          )
        }
      })
    }
  }
}
</script>

文件预览和限制

在文件选择后显示预览和文件信息:

<template>
  <div>
    <input type="file" multiple @change="handleFileChange" accept="image/*,.pdf" />
    <div v-for="(file, index) in files" :key="index">
      <p>{{ file.name }} ({{ formatSize(file.size) }})</p>
      <img v-if="file.type.includes('image')" :src="getPreview(file)" width="100" />
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleFileChange(event) {
      const files = Array.from(event.target.files)
      // 限制文件大小
      this.files = files.filter(file => file.size < 5 * 1024 * 1024)
    },
    getPreview(file) {
      return URL.createObjectURL(file)
    },
    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]
    }
  }
}
</script>

这些方法提供了从基础到进阶的多文件上传实现方案,可以根据项目需求选择适合的方式或组合使用。

vue实现多文件上传

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

相关文章

vue实现签约合作弹窗

vue实现签约合作弹窗

实现签约合作弹窗的步骤 使用Vue实现签约合作弹窗可以通过组件化方式完成,结合模态框和表单交互逻辑。以下是具体实现方法: 1. 创建弹窗组件 新建一个Vue组件文件(如SignContractDi…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…

vue实现矩阵

vue实现矩阵

Vue 实现矩阵的方法 在 Vue 中实现矩阵操作可以通过多种方式完成,以下是一些常见的方法: 使用二维数组表示矩阵 矩阵可以用二维数组来表示,每个元素对应矩阵中的一个值。在 Vue 的 data…

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue实现框架

vue实现框架

Vue 框架实现的核心方法 基础项目搭建 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代轻量级应用。安装后通过命令行工具选择所需配置(如 Rou…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…