当前位置:首页 > VUE

vue 实现文件上传

2026-01-14 04:14:52VUE

Vue 文件上传实现方法

使用原生 input 元素

创建一个文件上传表单,通过 @change 事件获取文件对象

<template>
  <input type="file" @change="handleFileUpload" />
</template>

<script>
export default {
  methods: {
    handleFileUpload(event) {
      const file = event.target.files[0];
      console.log('Selected file:', file);
    }
  }
}
</script>

使用 axios 发送文件

将文件通过 FormData 对象发送到服务器

methods: {
  async uploadFile(file) {
    const formData = new FormData();
    formData.append('file', file);

    try {
      const response = await axios.post('/api/upload', formData, {
        headers: {
          'Content-Type': 'multipart/form-data'
        }
      });
      console.log('Upload success:', response.data);
    } catch (error) {
      console.error('Upload failed:', error);
    }
  }
}

使用第三方组件库

Element UI 的上传组件示例

vue 实现文件上传

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

<script>
export default {
  methods: {
    beforeUpload(file) {
      const isLt2M = file.size / 1024 / 1024 < 2;
      if (!isLt2M) {
        this.$message.error('文件大小不能超过2MB');
        return false;
      }
      return true;
    },
    handleSuccess(response) {
      this.$message.success('上传成功');
    }
  }
}
</script>

实现拖拽上传

添加拖拽区域和事件处理

<template>
  <div 
    class="drop-area"
    @dragover.prevent
    @drop="handleDrop">
    拖拽文件到此处上传
  </div>
</template>

<script>
export default {
  methods: {
    handleDrop(e) {
      e.preventDefault();
      const files = e.dataTransfer.files;
      if (files.length) {
        this.uploadFile(files[0]);
      }
    }
  }
}
</script>

<style>
.drop-area {
  border: 2px dashed #ccc;
  padding: 20px;
  text-align: center;
}
</style>

文件预览功能

在上传前显示图片预览

vue 实现文件上传

methods: {
  handleFileChange(event) {
    const file = event.target.files[0];
    if (!file.type.match('image.*')) return;

    const reader = new FileReader();
    reader.onload = (e) => {
      this.previewImage = e.target.result;
    };
    reader.readAsDataURL(file);
  }
}

多文件上传处理

支持同时选择多个文件

methods: {
  handleMultipleFiles(event) {
    const files = Array.from(event.target.files);
    files.forEach(file => {
      this.uploadFile(file);
    });
  }
}

进度显示

显示文件上传进度

methods: {
  uploadWithProgress(file) {
    const formData = new FormData();
    formData.append('file', file);

    axios.post('/api/upload', formData, {
      headers: {'Content-Type': 'multipart/form-data'},
      onUploadProgress: progressEvent => {
        const percentCompleted = Math.round(
          (progressEvent.loaded * 100) / progressEvent.total
        );
        this.uploadPercent = percentCompleted;
      }
    }).then(response => {
      console.log('Upload complete');
    });
  }
}

以上方法可以根据实际需求组合使用,实现完整的文件上传功能。

标签: 文件上传vue
分享给朋友:

相关文章

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <template…

vue实现alert

vue实现alert

实现自定义 Alert 组件 在 Vue 中可以通过组件化方式实现自定义 Alert 弹窗。以下是基于 Vue 3 的实现示例: 组件代码 (Alert.vue) <template>…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。it…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…