首页 > 其他分享 >使用 Element Plus 和 FileReader 实现图片上传预览

使用 Element Plus 和 FileReader 实现图片上传预览

时间:2024-09-16 09:53:24浏览次数:12  
标签:文件 const 预览 URL FileReader Element Plus 上传

使用 Element Plus 和 FileReader 实现图片上传预览

在现代Web开发中,图片上传是一个常见的需求。很多时候,我们希望在图片上传到服务器之前,能够在客户端进行预览。这里,我们将使用Vue 3和Element Plus的<el-upload>组件结合FileReader API来实现这一功能。

1. 组件模板

首先,我们来看一下Vue组件的模板部分。这里使用了Element Plus的<el-upload>组件,并设置了几个关键的属性来控制上传行为:

<template>
  <div class="avatar-upload">
    <el-upload
      class="avatar-uploader"
      action=""
      :show-file-list="false"
      :auto-upload="false"
      :before-upload="beforeAvatarUpload"
      :on-change="handleFileChange"
      :http-request="uploadImage"
    >
      <div v-if="previewUrl" class="avatar-preview">
        <img :src="previewUrl" class="avatar">
        <div class="mask">
          <el-icon><Edit /></el-icon>
        </div>
      </div>
      <el-icon v-else class="plus-icon"><Plus /></el-icon>
    </el-upload>
  </div>
</template>

在这个模板中,<el-upload>组件的action属性被设置为空字符串,因为我们不希望在用户选择文件后立即自动上传到服务器。:auto-upload="false"确保了这个行为。:before-upload:on-change:http-request是三个重要的回调属性,它们分别用于文件上传前的检查、文件选择后的处理和自定义上传逻辑。

2. 组件逻辑

接下来,我们看一下组件的<script setup>部分:

<script setup>
import { ref } from 'vue';
import { Plus, Edit } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';

const previewUrl = ref('');

// 文件上传前的检查
const beforeAvatarUpload = (file) => {
  const isJPG = ['image/jpeg', 'image/png', 'image/gif', 'image/bmp'].includes(file.type);
  const isLt2M = file.size / 1024 / 1024 < 5;
  if (!isJPG) {
    ElMessage.error('上传头像图片只能是 JPG PNG GIF BMP 格式!');
  }
  if (!isLt2M) {
    ElMessage.error('上传头像图片大小不能超过 5MB!');
  }
  return isJPG && isLt2M;
};

// 文件选择后的处理
const handleFileChange = (file, fileList) => {
  if (!file.raw) {
    return;
  }
  const reader = new FileReader();
  reader.onload = (e) => {
    previewUrl.value = e.target.result;
  };
  reader.readAsDataURL(file.raw);
};

// 自定义上传逻辑
const uploadImage = async (params) => {
  try {
    // 这里假设有一个上传图片的API函数
    const res = await uploadEmployeeImage(params.file);
    ElMessage.success('上传成功');
    // 可以在这里处理上传成功后的逻辑,例如更新预览图或通知父组件
  } catch (error) {
    ElMessage.error('上传失败');
  }
};

// 假设的上传函数
async function uploadEmployeeImage(file) {
  // 实现上传逻辑
  // 这里返回模拟的上传结果
  return {
    data: {
      url: '模拟的图片URL'
    }
  };
}
</script>

在组件逻辑中,beforeAvatarUpload函数用于在文件上传前进行格式和大小的检查。handleFileChange函数用于处理文件选择事件,它使用FileReader来读取文件内容,并将其转换为DataURL,然后更新previewUrl的值以显示预览图。uploadImage函数是一个自定义的上传逻辑,它可以在这里调用实际的API来上传文件。

3. 知识点和对比

FileReader vs URL.createObjectURL
  • FileReader:用于读取用户计算机上的文件内容,并可以将文件内容以不同格式(如文本、二进制数据、DataURL等)进行输出。它适用于需要读取文件内容并对其进行进一步处理的场景。
  • URL.createObjectURL:用于创建一个表示File或Blob对象的URL,这个URL可以直接在<img><audio><video>等标签的src属性中使用,而无需等待文件内容被完全读取。它特别适合于大文件的即时预览或需要即时反馈的场景。
何时使用URL.createObjectURL?
  • 大文件预览:当需要预览大文件(如高清图片、视频文件)时,使用URL.createObjectURL()可以更快地提供预览。
  • 即时反馈:在需要即时反馈的场景中(如文件选择器选择文件后立即显示预览),URL.createObjectURL()也是一个好选择。
  • 动态内容:如果你正在处理动态生成的内容(如通过JavaScript生成的图像或视频),并且希望立即在DOM中显示这些内容,URL.createObjectURL()可以帮助你实现。

总结

通过结合Element Plus的<el-upload>组件和FileReader API,我们可以轻松地在Vue 3项目中实现图片上传的预览功能。同时,了解FileReaderURL.createObjectURL的区别和适用场景,可以帮助我们在不同场景下做出更合适的选择。

标签:文件,const,预览,URL,FileReader,Element,Plus,上传
From: https://blog.csdn.net/everfoot/article/details/142299037

相关文章

  • elemenPlus表单From相关大全
    表单包含 输入框, 单选框, 下拉选择, 多选框 等用户输入的组件。使用表单,您可以收集、验证和提交数据。Form组件已经从2.x的Float布局升级为Flex布局。典型表单最基础的表单包括各种输入表单项,比如input、select、radio、checkbox等。在每一个 form 组件中......
  • Element Plus中button按钮相关大全
    一、基本用法使用 type、plain、round 和 circle 来定义按钮的样式。样式代码如下:<template><divclass="mb-4"><el-button>Default</el-button><el-buttontype="primary">Primary</el-button><el-buttontype=&quo......
  • Elment Plus数据展示 | Progress进度条(超详细!)
            用于展示操作进度,告知用户当前状态和预期。一、直线进度条        Progress组件设置 percentage 属性即可,表示进度条对应的百分比。该属性必填,并且必须在 0-100 的范围内。你可以通过设置 format 来自定义文字显示的格式。     运行......
  • C++ Primer Plus 第六版中文版(上)
    参考资料:《C++PrimerPlus第六版中文版》笔记作者:Mr.Crocodile欢迎转载文章目录开始学习C++头文件命名规定名称空间`cout`、`cin`函数处理数据简单变量变量命名规则整型运算符`sizeof`和头文件climitsclimits中的符号常量变量初始化整型字面量整型字面量后缀char......
  • mybatis plus多表查询的扩展
    mybatisplus提供了简单的CURD操作,但是有时我们的业务需要要求进行多表查询,这个时候,我们就需要加入多表查询的扩展了。 mybatis-plus-join,基于mybatis-plus的所有优点,然后还支持连表查询,还支持一对多,一对一的查询。mybatis-plus-join是mybatisplus的一个多表插件,上手简单,几分钟就......
  • 【前端UI框架】VUE ElementUI 离线文档 可不联网打开
    【前端UI框架】VUEElementUI离线文档可不联网打开Element-Theworld'smostpopularVueUIframeworkElement-Theworld'smostpopularVueUIframework离线文档下载地址文档制作第一步:克隆源代码Gitee地址:https://gitee.com/ElemeFE/element.gitGitHub地址:https:......
  • cpp primer plus 第七章
    7.1函数基本知识7.1.1定义函数函数分为两类:有返回值与无返回值的函数。对于有返回值的函数,必须使用返回语句,将值返回给调用函数。若函数包含多条返回语句,则函数在执行第一条返回语句后结束。7.1.2函数原型声明函数如果在main函数后方,则在前面声明函数(复制函数定义中的......
  • SpringBoot:Web开发(基于SpringBoot使用MyBatis-Plus+JSP开发)
    目录前期准备构建项目(IDEA2023.1.2,JDK21,SpringBoot3.3.3)添加启动器Model准备这里我们利用MybatisX插件生成我们所需要的实体类、数据访问层以及服务层注意选择MyBatis-Plus3以及Lombok然后再在service接口中定义我们所需要的方法以及实现类(利用MyBatis-Plus省去我们......
  • 尤雨溪推荐的拖拽插件,支持Vue2/Vue3 VueDraggablePlus
    大家好,我是「前端实验室」爱分享的了不起~今天在网上看到尤雨溪推荐的这款拖拽组件,试了一下非常不错,这里推荐给大家。说到拖拽工具库,非大名鼎鼎的的Sortablejs莫属。它是前端领域比较知名的,且功能强大的工具。但我们直接使用Sortablejs的情况很少,一般都是使用基于它的......
  • elementUI--el-form表单数据校验
    一、普通的值类型的数据校验①设置 el-form-item的prop 值与 formdata中定义的key 保持一致`②如果rules需要通过el-form统一设置,rules的key 定义也与prop保持一致(如果不一致,需要在el-form-item中手动指定)③复杂的校验函数可通过 validator 单独定义<el-for......