) 通过 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 实现视频上传功能 安装依赖 确保项目中已安装 axios 或 vue-upload-component 等上传库。通过 npm 安装: npm install axios 前端组件实现 创建…

vue实现tab功能

vue实现tab功能

Vue 实现 Tab 功能的方法 使用动态组件和 v-if 指令 通过 v-if 或 v-show 控制不同 Tab 内容的显示与隐藏。这种方法适合简单的 Tab 切换需求。 <templa…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

php实现linux关机重启功能

php实现linux关机重启功能

通过PHP执行Linux关机或重启命令 PHP可以通过exec()、shell_exec()或system()等函数调用系统命令实现关机或重启功能,但需注意权限问题。 使用exec函数执行命令 //…

php实现留言板功能

php实现留言板功能

PHP 留言板功能实现 数据库设计 创建数据库表 messages,包含以下字段: id:自增主键 name:留言者姓名(VARCHAR) email:留言者邮箱(VARCHAR) content…

vue实现按钮实现点击功能

vue实现按钮实现点击功能

实现按钮点击功能 在Vue中实现按钮点击功能可以通过v-on指令或@缩写来绑定事件。以下是几种常见的实现方式: 使用v-on指令 通过v-on:click绑定点击事件,触发定义在methods中的方…