当前位置:首页 > VUE

vue上传照片怎样实现

2026-02-22 17:10:58VUE

使用 Vue 实现照片上传功能

基础实现(使用原生 HTML 文件输入)

创建一个文件输入元素,绑定 change 事件来获取文件:

<template>
  <div>
    <input type="file" @change="handleFileUpload" accept="image/*" />
    <button @click="uploadFile">上传</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null
    }
  },
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0]
    },
    uploadFile() {
      if (!this.selectedFile) return

      const formData = new FormData()
      formData.append('file', this.selectedFile)

      // 使用 axios 或其他 HTTP 客户端发送请求
      axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      })
      .then(response => {
        console.log('上传成功', response.data)
      })
      .catch(error => {
        console.error('上传失败', error)
      })
    }
  }
}
</script>

使用第三方组件(如 Element UI)

对于更丰富的 UI 体验,可以使用 UI 库提供的上传组件:

vue上传照片怎样实现

<template>
  <el-upload
    action="/api/upload"
    :on-success="handleSuccess"
    :on-error="handleError"
    :before-upload="beforeUpload"
    :file-list="fileList">
    <el-button size="small" type="primary">点击上传</el-button>
  </el-upload>
</template>

<script>
export default {
  data() {
    return {
      fileList: []
    }
  },
  methods: {
    handleSuccess(response, file) {
      console.log('上传成功', response)
    },
    handleError(err, file) {
      console.error('上传失败', err)
    },
    beforeUpload(file) {
      const isImage = file.type.includes('image/')
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isImage) {
        this.$message.error('只能上传图片文件')
      }
      if (!isLt2M) {
        this.$message.error('图片大小不能超过 2MB')
      }

      return isImage && isLt2M
    }
  }
}
</script>

图片预览功能

在文件选择后立即显示预览:

vue上传照片怎样实现

<template>
  <div>
    <input type="file" @change="handleFileUpload" accept="image/*" />
    <img v-if="imageUrl" :src="imageUrl" width="200" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      imageUrl: ''
    }
  },
  methods: {
    handleFileUpload(event) {
      const file = event.target.files[0]
      if (!file) return

      this.imageUrl = URL.createObjectURL(file)

      // 记得在组件销毁时释放对象 URL
    },
    beforeDestroy() {
      if (this.imageUrl) {
        URL.revokeObjectURL(this.imageUrl)
      }
    }
  }
}
</script>

多文件上传

支持一次选择多个文件并上传:

<template>
  <div>
    <input type="file" @change="handleFileUpload" multiple accept="image/*" />
    <button @click="uploadFiles">上传所有</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    }
  },
  methods: {
    handleFileUpload(event) {
      this.files = Array.from(event.target.files)
    },
    uploadFiles() {
      if (this.files.length === 0) return

      const formData = new FormData()
      this.files.forEach(file => {
        formData.append('files[]', file)
      })

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

进度显示

显示上传进度:

<template>
  <div>
    <input type="file" @change="handleFileUpload" />
    <button @click="uploadFile">上传</button>
    <div v-if="progress > 0">
      上传进度: {{ progress }}%
      <progress :value="progress" max="100"></progress>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedFile: null,
      progress: 0
    }
  },
  methods: {
    handleFileUpload(event) {
      this.selectedFile = event.target.files[0]
      this.progress = 0
    },
    uploadFile() {
      if (!this.selectedFile) return

      const formData = new FormData()
      formData.append('file', this.selectedFile)

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

这些方法提供了从基础到高级的照片上传实现方式,可以根据项目需求选择合适的方案。

标签: 上传照片vue
分享给朋友:

相关文章

vue实现头像剪切

vue实现头像剪切

Vue 实现头像剪切的实现方法 使用 vue-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm inst…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动渲…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

vue登录实现

vue登录实现

Vue 登录实现 实现登录功能通常需要前端与后端配合,Vue 作为前端框架,主要负责表单处理、请求发送和状态管理。以下是常见的实现方式: 表单设计与数据绑定 使用 Vue 的 v-model 实现表…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…

vue弹幕实现

vue弹幕实现

Vue弹幕实现方法 弹幕功能常见于视频直播或评论区,以下是基于Vue的实现方案,涵盖基础弹幕、动画控制及性能优化。 基础弹幕渲染 通过v-for动态渲染弹幕列表,结合CSS实现横向移动效果。弹幕数据…