) 通过 v-on:change 监听文件选择事件,获取 File 对象后通过 FormData 上传:…">
当前位置:首页 > VUE

Vue上传功能实现

2026-02-24 21:45:55VUE

Vue 文件上传功能实现

基础实现(使用原生 <input type="file">

通过 v-on:change 监听文件选择事件,获取 File 对象后通过 FormData 上传:

<template>
  <div>
    <input type="file" @change="handleFileUpload"/>
    <button @click="submitFile">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null
    }
  },
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0]
    },
    async submitFile() {
      const formData = new FormData()
      formData.append('file', this.selectedFile)

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

使用第三方库(如 vue-upload-component)

安装组件库:

npm install vue-upload-component

组件实现示例:

Vue上传功能实现

<template>
  <uploader
    :options="options"
    :auto-start="false"
    @file-added="onFileAdded"
  >
    <uploader-unsupport></uploader-unsupport>
    <uploader-drop>
      <p>拖拽文件到此处或</p>
      <uploader-btn>选择文件</uploader-btn>
    </uploader-drop>
    <uploader-list></uploader-list>
  </uploader>
</template>

<script>
import { Uploader, UploaderBtn, UploaderDrop, UploaderList } from 'vue-upload-component'

export default {
  components: {
    Uploader,
    UploaderBtn,
    UploaderDrop,
    UploaderList
  },
  data() {
    return {
      options: {
        target: '/api/upload',
        testChunks: false
      }
    }
  },
  methods: {
    onFileAdded(file) {
      file.upload()
    }
  }
}
</script>

进度显示实现

通过 Axios 的 onUploadProgress 回调实现进度监控:

methods: {
  async submitFile() {
    const formData = new FormData()
    formData.append('file', this.selectedFile)

    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}%`)
          // 可绑定到data中的progress变量显示进度条
        }
      })
    } catch (error) {
      console.error(error)
    }
  }
}

多文件上传实现

修改 handleFileUpload 方法处理多个文件:

Vue上传功能实现

methods: {
  handleFileUpload(event) {
    this.selectedFiles = Array.from(event.target.files)
  },
  async submitFiles() {
    const formData = new FormData()
    this.selectedFiles.forEach(file => {
      formData.append('files[]', file)
    })

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

文件类型限制

通过 HTML5 的 accept 属性限制文件类型:

<input 
  type="file" 
  @change="handleFileUpload"
  accept=".jpg,.jpeg,.png,.pdf"
>

或在方法中验证:

handleFileUpload(event) {
  const file = event.target.files[0]
  const allowedTypes = ['image/jpeg', 'image/png']

  if (!allowedTypes.includes(file.type)) {
    alert('仅支持JPEG/PNG格式')
    return
  }
  this.selectedFile = file
}

服务器端注意事项

  1. 确保服务器配置了足够大的 max_file_size
  2. 处理跨域请求(如需要)
  3. 实现文件重命名逻辑避免冲突
  4. 考虑文件存储位置(本地/云存储)

标签: 上传功能
分享给朋友:

相关文章

vue修改功能实现

vue修改功能实现

Vue 修改功能的实现方法 在 Vue 中实现修改功能通常涉及表单绑定、数据更新和事件处理。以下是几种常见的实现方式: 数据双向绑定 使用 v-model 指令实现表单元素与 Vue 实例数据的双向…

vue实现注册功能

vue实现注册功能

实现注册功能的基本步骤 在Vue中实现注册功能通常需要结合前端表单和后端API交互。以下是常见的实现方式: 创建注册表单组件 <template> <div class…

vue实现后台功能

vue实现后台功能

Vue 实现后台功能的方法 Vue.js 是一个流行的前端框架,适合构建后台管理系统。以下是实现后台功能的常见方法和步骤。 项目初始化 使用 Vue CLI 或 Vite 初始化项目: # Vue…

vue实现注册功能

vue实现注册功能

前端实现注册功能 在Vue中实现注册功能通常需要结合表单验证、HTTP请求和状态管理。以下是一个基于Vue 3和Element Plus的完整实现方案: 模板部分 <template>…

vue实现模态功能

vue实现模态功能

Vue 实现模态框功能 方法一:使用组件和v-if/v-show控制显示 创建独立的模态框组件(如Modal.vue),通过props接收标题、内容等数据,使用v-if或v-show控制显示状态。…

vue 实现多选功能

vue 实现多选功能

Vue 实现多选功能的方法 使用 v-model 绑定数组 在 Vue 中,可以通过 v-model 绑定一个数组来实现多选功能。适用于复选框组(checkbox)或下拉多选(select multi…