当前位置:首页 > VUE

vue实现图片上传源码

2026-02-23 20:26:54VUE

vue实现图片上传源码

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>

分享给朋友:

相关文章

uniapp游戏源码

uniapp游戏源码

获取UniApp游戏源码的途径 开源平台 GitHub、Gitee等平台提供大量UniApp开发的游戏源码,搜索关键词如“uniapp game demo”或“uniapp 游戏源码”,可找到类似《2…

jquery 源码

jquery 源码

jQuery 源码解析 jQuery 是一个快速、小巧且功能丰富的 JavaScript 库。以下是其核心源码结构的解析: 核心架构 jQuery 源码采用模块化设计,核心功能包括选择器引擎、DOM…

php实现异步图片上传

php实现异步图片上传

异步图片上传的实现方法 在PHP中实现异步图片上传通常需要结合前端JavaScript和后端PHP代码。以下是几种常见的方法: 使用XMLHttpRequest或Fetch API 前端使用Java…

vue实现图片上传预览

vue实现图片上传预览

实现图片上传预览功能 在Vue中实现图片上传预览功能可以通过以下方式完成: 使用input标签和FileReader对象 创建一个文件上传输入框,监听change事件,使用FileReader读取文…

vue如何实现图片上传

vue如何实现图片上传

实现图片上传的基本步骤 在Vue中实现图片上传通常需要结合HTML的<input type="file">元素和JavaScript的File API。以下是具体实现方法: 创建一个文件…

如何运行react源码

如何运行react源码

运行 React 源码的步骤 克隆 React 源码仓库 从官方 GitHub 仓库克隆 React 源码: git clone https://github.com/facebook/reac…