) 通过 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

组件实现示例:

<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 方法处理多个文件:

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

或在方法中验证:

Vue上传功能实现

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-on 指令的简写,用于绑定事件监听器。以下是具体实现方式: 基本语法 <button @click="handleClick">…

uniapp实现选项卡功能

uniapp实现选项卡功能

实现选项卡功能的基本方法 在uniapp中实现选项卡功能通常需要使用uni-segmented-control组件或自定义样式结合swiper组件。以下是两种常见实现方式: 使用uni-segmen…

vue 实现筛选功能

vue 实现筛选功能

实现筛选功能的基本思路 在Vue中实现筛选功能通常涉及以下几个核心步骤:数据绑定、筛选逻辑处理、结果展示。以下是具体实现方法。 数据准备与绑定 准备一个包含所有数据的数组,并使用v-model或v-…

vue实现app功能

vue实现app功能

Vue 实现 App 功能的常见方法 使用 Capacitor 或 Cordova 进行混合开发 Vue 结合 Capacitor 或 Cordova 可以将 Web 应用打包成原生 App。Capa…

vue实现上传表格

vue实现上传表格

Vue实现上传表格的方法 使用Element UI上传组件 Element UI提供了el-upload组件,可以方便地实现文件上传功能。需要安装Element UI并引入相关组件。 安装Eleme…

vue实现修改功能

vue实现修改功能

Vue 实现修改功能的方法 数据绑定与表单处理 使用v-model实现双向数据绑定,快速获取表单输入值。适用于表单类修改场景: <template> <input v-mode…