) 通过 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电影功能实现 数据获取与展示 使用Axios或Fetch API从电影API获取数据,例如TMDB或豆瓣API。在Vue组件的created或mounted生命周期钩子中发起请求,将返回的电影数…

vue实现tab功能

vue实现tab功能

Vue实现Tab功能的方法 使用动态组件和v-for指令 在Vue中实现Tab功能可以通过动态组件和v-for指令结合完成。定义一个包含tab标题和对应内容的数组,使用v-for渲染tab标题,并通过…

vue实现轨道功能

vue实现轨道功能

Vue 实现轨道功能的方法 轨道功能通常指在界面中实现元素沿特定路径移动的效果,例如进度条、时间轴或动画轨迹。以下是几种常见的实现方式: 使用 CSS 动画与 Vue 结合 通过 Vue 动态绑定样…

vue实现置顶功能

vue实现置顶功能

实现置顶功能的基本思路 在Vue中实现置顶功能通常涉及对数据列表的操作,通过调整数组元素的顺序或添加标识属性来实现。以下是几种常见方法: 方法一:通过数组排序实现 利用数组的sort方法,根据元素的…

vue下载功能实现

vue下载功能实现

实现 Vue 文件下载功能 在 Vue 项目中实现文件下载功能可以通过多种方式完成,以下是几种常见的方法: 使用 <a> 标签下载 通过动态创建 <a> 标签并设置 dow…

vue留言功能实现

vue留言功能实现

Vue 留言功能实现 数据模型设计 留言功能通常需要以下数据结构: id: 唯一标识符 content: 留言内容 createdAt: 创建时间 author: 作者信息(可选) 示例数据结构:…