当前位置:首页 > VUE

vue实现拖拽上传文件

2026-02-22 21:15:05VUE

Vue 拖拽上传文件实现方法

使用 HTML5 拖拽 API 和 Vue 事件绑定

在 Vue 组件中监听 dragoverdrop 事件,阻止默认行为并处理文件上传逻辑。

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

<script>
export default {
  methods: {
    handleDragOver(event) {
      event.currentTarget.classList.add('dragover')
    },
    handleDrop(event) {
      event.currentTarget.classList.remove('dragover')
      const files = event.dataTransfer.files
      this.uploadFiles(files)
    },
    handleFileSelect(event) {
      const files = event.target.files
      this.uploadFiles(files)
    },
    uploadFiles(files) {
      // 实现上传逻辑
      console.log(files)
    }
  }
}
</script>

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

使用第三方库 vue-drag-drop

安装 vue-drag-drop 库可以简化拖拽上传的实现。

vue实现拖拽上传文件

npm install vue-drag-drop

在组件中使用:

<template>
  <div class="container">
    <drop-zone @files-dropped="handleFiles">
      <p>拖拽文件到此处上传</p>
    </drop-zone>
  </div>
</template>

<script>
import { DropZone } from 'vue-drag-drop'

export default {
  components: {
    DropZone
  },
  methods: {
    handleFiles(files) {
      // 处理上传逻辑
      console.log(files)
    }
  }
}
</script>

实现文件预览功能

在拖拽上传时添加文件预览功能可以提升用户体验。

vue实现拖拽上传文件

<template>
  <div>
    <div 
      class="drop-area"
      @dragover.prevent
      @drop.prevent="handleDrop"
    >
      <p>拖拽文件到此处上传</p>
    </div>
    <div v-if="previews.length" class="previews">
      <div v-for="(preview, index) in previews" :key="index">
        <img v-if="preview.type.startsWith('image/')" :src="preview.url" width="100">
        <div v-else>{{ preview.name }}</div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      previews: []
    }
  },
  methods: {
    handleDrop(event) {
      const files = event.dataTransfer.files
      this.generatePreviews(files)
    },
    generatePreviews(files) {
      this.previews = []
      Array.from(files).forEach(file => {
        const reader = new FileReader()
        reader.onload = (e) => {
          this.previews.push({
            name: file.name,
            type: file.type,
            url: e.target.result
          })
        }
        if (file.type.startsWith('image/')) {
          reader.readAsDataURL(file)
        } else {
          this.previews.push({
            name: file.name,
            type: file.type
          })
        }
      })
    }
  }
}
</script>

使用 axios 实现文件上传

结合 axios 可以实现完整的文件上传功能。

methods: {
  async uploadFiles(files) {
    const formData = new FormData()
    Array.from(files).forEach(file => {
      formData.append('files[]', file)
    })

    try {
      const response = await axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      console.log('上传成功', response.data)
    } catch (error) {
      console.error('上传失败', error)
    }
  }
}

添加进度条功能

上传大文件时显示进度条可以提升用户体验。

<template>
  <div>
    <progress v-if="uploadProgress > 0" :value="uploadProgress" max="100"></progress>
  </div>
</template>

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

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

分享给朋友:

相关文章

vue实现拖拽旋转

vue实现拖拽旋转

Vue 实现拖拽旋转 核心思路 通过监听鼠标事件计算旋转角度,结合 CSS 的 transform: rotate() 实现旋转效果。需要处理 mousedown、mousemove 和 mouseu…

vue实现dom拖拽

vue实现dom拖拽

Vue 实现 DOM 拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中,可以通过绑定这些事件来实…

vue实现拖拽互换

vue实现拖拽互换

Vue 实现拖拽互换 在 Vue 中实现拖拽互换功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来完成。以下是两种方法的实现方式: 使用 HTML5 拖放 AP…

vue实现导航拖拽

vue实现导航拖拽

Vue 实现导航拖拽功能 在 Vue 中实现导航拖拽功能,可以通过原生 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种方法的详细实现步骤: 使用 HTML5…

vue栅格拖拽怎么实现

vue栅格拖拽怎么实现

实现Vue栅格拖拽的方法 使用Vue实现栅格拖拽功能可以通过第三方库或原生HTML5拖拽API完成。以下是几种常见实现方式: 使用Vue.Draggable库 Vue.Draggable是基于Sor…

vue快速实现拖拽指令

vue快速实现拖拽指令

基础拖拽指令实现 通过v-drag指令实现元素拖拽功能,核心是利用鼠标事件和CSS变换: Vue.directive('drag', { inserted(el) { el.style.…