当前位置:首页 > VUE

vue实现图片上传源码

2026-01-23 05:49:09VUE

Vue 图片上传实现源码

以下是一个基于 Vue 的图片上传组件实现,包含前端代码和关键逻辑说明。示例使用 axios 发送请求,并支持预览、限制文件类型和大小等功能。

基础模板结构

<template>
  <div class="upload-container">
    <input 
      type="file" 
      accept="image/*" 
      @change="handleFileChange" 
      ref="fileInput"
    />
    <button @click="triggerUpload">选择图片</button>

    <!-- 图片预览 -->
    <div v-if="previewUrl" class="preview">
      <img :src="previewUrl" alt="预览" />
      <button @click="removeImage">删除</button>
    </div>

    <!-- 上传按钮 -->
    <button 
      @click="uploadImage" 
      :disabled="!selectedFile"
    >上传</button>

    <!-- 进度条 -->
    <div v-if="uploadProgress > 0" class="progress">
      <div :style="{ width: uploadProgress + '%' }"></div>
    </div>
  </div>
</template>

脚本逻辑

<script>
import axios from 'axios';

export default {
  data() {
    return {
      selectedFile: null,
      previewUrl: '',
      uploadProgress: 0
    };
  },
  methods: {
    triggerUpload() {
      this.$refs.fileInput.click();
    },

    handleFileChange(e) {
      const file = e.target.files[0];
      if (!file) return;

      // 校验文件类型和大小(示例限制2MB)
      const validTypes = ['image/jpeg', 'image/png', 'image/gif'];
      const maxSize = 2 * 1024 * 1024; // 2MB

      if (!validTypes.includes(file.type)) {
        alert('仅支持JPEG/PNG/GIF格式');
        return;
      }

      if (file.size > maxSize) {
        alert('文件大小不能超过2MB');
        return;
      }

      this.selectedFile = file;
      this.previewUrl = URL.createObjectURL(file);
    },

    removeImage() {
      this.selectedFile = null;
      this.previewUrl = '';
      this.$refs.fileInput.value = '';
    },

    async uploadImage() {
      if (!this.selectedFile) return;

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

      try {
        const res = await axios.post('/api/upload', formData, {
          onUploadProgress: (progressEvent) => {
            this.uploadProgress = Math.round(
              (progressEvent.loaded / progressEvent.total) * 100
            );
          }
        });

        alert('上传成功');
        this.$emit('uploaded', res.data.url); // 触发成功回调
        this.removeImage();
      } catch (error) {
        alert('上传失败: ' + error.message);
      } finally {
        this.uploadProgress = 0;
      }
    }
  }
};
</script>

样式示例

<style scoped>
.upload-container {
  display: flex;
  flex-direction: column;
  gap: 10px;
  max-width: 500px;
}

input[type="file"] {
  display: none;
}

.preview img {
  max-width: 100%;
  max-height: 200px;
}

.progress {
  height: 6px;
  background: #eee;
}

.progress div {
  height: 100%;
  background: #42b983;
  transition: width 0.3s;
}
</style>

关键功能说明

文件选择与预览
通过隐藏的 <input type="file"> 触发文件选择,使用 URL.createObjectURL 生成预览图的临时URL。

文件校验
handleFileChange 方法中对文件类型和大小进行校验,避免无效上传。

上传进度
通过 axiosonUploadProgress 回调实现实时进度显示,进度条通过CSS动态宽度呈现。

后端对接
示例中上传接口为 /api/upload,实际需替换为真实接口地址。后端需接收 multipart/form-data 格式数据。

扩展建议

  1. 多图上传
    修改 inputmultiple 属性并调整逻辑为数组存储:

    <input type="file" multiple @change="handleFilesChange" />
  2. 拖拽上传
    添加拖拽区域事件监听:

    @dragover.prevent
    @drop.prevent="handleDrop"
  3. 图片裁剪
    集成第三方库如 cropperjs 实现前端裁剪功能。

  4. 云存储直传
    如需上传至阿里云OSS或七牛云等,可使用各平台提供的SDK实现签名直传。

    vue实现图片上传源码

分享给朋友:

相关文章

jquery源码

jquery源码

jQuery 源码解析 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。其源码设计精妙,值得深入分析。 源码结构 jQuer…

vue axios实现登录源码

vue axios实现登录源码

以下是一个基于Vue.js和Axios实现登录功能的完整示例代码,包含前端和后端交互逻辑: 前端部分(Vue组件) 安装Axios依赖: npm install axios 登录组件(Login.…

vue如何实现图片上传

vue如何实现图片上传

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

vue中实现图片上传

vue中实现图片上传

使用 input 元素和 FileReader 实现图片上传 在 Vue 中创建一个文件输入元素,监听 change 事件获取用户选择的图片文件。通过 FileReader 将图片转换为 Base64…

如何看react源码

如何看react源码

阅读React源码的方法 克隆React仓库 从GitHub克隆React的官方仓库,切换到稳定版本分支。React采用Monorepo结构,核心代码在packages/react和packages/…

react 如何做源码分析

react 如何做源码分析

理解React源码结构 React源码托管在GitHub上,主要分为packages目录,包含核心模块如react、react-dom、scheduler等。每个模块功能独立,通过协同工作实现整体功能…