当前位置:首页 > VUE

vue实现图片上传源码

2026-02-23 20:26:54VUE

Vue 图片上传实现方法

基础实现(使用原生 input 和 FileReader)

<template>
  <div>
    <input type="file" @change="handleFileChange" accept="image/*">
    <img v-if="imageUrl" :src="imageUrl" alt="Preview" style="max-width: 300px;">
  </div>
</template>

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

      const reader = new FileReader()
      reader.onload = (e) => {
        this.imageUrl = e.target.result
      }
      reader.readAsDataURL(file)
    }
  }
}
</script>

使用第三方库(如 axios 上传到服务器)

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

<script>
import axios from 'axios'

export default {
  data() {
    return {
      selectedFile: null
    }
  },
  methods: {
    handleFileUpload() {
      this.selectedFile = this.$refs.fileInput.files[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'
        }
      }).then(response => {
        console.log('上传成功', response.data)
      }).catch(error => {
        console.error('上传失败', error)
      })
    }
  }
}
</script>

使用 Element UI 组件库

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

<script>
export default {
  methods: {
    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
    },
    handleSuccess(response, file) {
      this.$message.success('上传成功')
      console.log('文件地址:', response.url)
    }
  }
}
</script>

图片压缩处理

compressImage(file, quality = 0.8) {
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.readAsDataURL(file)
    reader.onload = (event) => {
      const img = new Image()
      img.src = event.target.result
      img.onload = () => {
        const canvas = document.createElement('canvas')
        const ctx = canvas.getContext('2d')
        const maxWidth = 1024
        const maxHeight = 1024
        let width = img.width
        let height = img.height

        if (width > maxWidth || height > maxHeight) {
          const ratio = Math.min(maxWidth / width, maxHeight / height)
          width *= ratio
          height *= ratio
        }

        canvas.width = width
        canvas.height = height
        ctx.drawImage(img, 0, 0, width, height)

        canvas.toBlob(
          (blob) => resolve(new File([blob], file.name, { type: 'image/jpeg' })),
          'image/jpeg',
          quality
        )
      }
    }
  })
}

多文件上传实现

<template>
  <div>
    <input type="file" multiple @change="handleMultipleFiles">
    <button @click="uploadMultiple">上传多个文件</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      files: []
    }
  },
  methods: {
    handleMultipleFiles(e) {
      this.files = Array.from(e.target.files)
    },
    async uploadMultiple() {
      if (this.files.length === 0) return

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

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

vue实现图片上传源码

分享给朋友:

相关文章

vue实现找回密码源码

vue实现找回密码源码

以下是一个基于 Vue.js 的找回密码功能实现方案,包含前端组件和后端交互逻辑的核心代码示例: 找回密码表单组件 <template> <div class="forgot…

uniapp 会员源码

uniapp 会员源码

Uniapp 会员系统源码获取途径 开源社区与代码平台 在 GitHub、Gitee 等平台搜索关键词如 uniapp member system 或 uniapp 会员系统,可找到部分开源项目。例如…

php实现图片上传预览

php实现图片上传预览

图片上传预览的实现方法 在PHP中实现图片上传预览功能,通常需要结合前端JavaScript和后端PHP代码。以下是具体的实现步骤: 前端HTML和JavaScript部分 创建包含文件输入和预览…

vue2.0源码实现

vue2.0源码实现

Vue 2.0 核心源码实现解析 Vue 2.0 的源码设计围绕响应式系统、虚拟 DOM 和组件化展开。以下是其核心模块的实现要点: 响应式系统 通过 Object.defineProperty 实…

vue实现聊天源码

vue实现聊天源码

Vue实现聊天功能的核心步骤 环境准备 安装Vue CLI创建项目,添加必要依赖如vue-socket.io或socket.io-client实现实时通信。基础项目结构需包含聊天组件、消息列表和输入框…

vue实现图片上传封面

vue实现图片上传封面

Vue 图片上传封面功能实现 准备工作 确保项目中已安装必要的依赖,如axios用于文件上传请求,element-ui或vant等UI库(可选)。 文件上传组件 创建一个文件上传组件,使用<i…