element-upload 上传图片限制文件格式、大小以及隐藏上传框

该博客展示了如何使用Vue.js创建一个图片上传组件,包括上传地址、成功回调、文件类型和大小检查、文件数量限制等功能。通过before-upload钩子函数验证文件类型和大小,当文件列表超过3个时会禁用上传,并在上传失败时进行错误处理。同时,提供预览功能和移除文件的选项。

废话不多说 先看效果
在这里插入图片描述
代码如下:

<template>
  <div>
    <div>
      <el-upload
        class="avatar-uploader"
        :action="upUrl"
        :on-success="handleAvatarSuccess"
        list-type="picture-card"
        :before-upload="beforeAvatarUpload"
        :on-preview="handlePictureCardPreview"
        :class="{ disabled: isMax }"
        :on-change="change"
        :on-remove="remove"
        :on-error="error"
      >
        <i class="el-icon-plus"></i>
      </el-upload>
      <el-dialog :visible.sync="dialogVisible">
        <img width="100%" :src="dialogImageUrl" alt="" />
      </el-dialog>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      upUrl: "http://xxxxxxx:8097/admin/oss/upload/image", //上传地址 必填 (process.env.VUE_APP_BASE_API + '/oss/upload/image')
      isMax: false,
      dialogImageUrl: "",
      dialogVisible: false,
    };
  },
  created() {},
  mounted() {},
  methods: {
    //文件上传成功时的钩子
    handleAvatarSuccess(res, file) {
      console.log("文件上传成功", res.data);
    },
    //上传文件之前的钩子,参数为上传的文件,可用作文件大小类型的判断,若返回 false 或者返回 Promise 且被 reject,则停止上传。	function(file)
    beforeAvatarUpload(file) {
      console.log("文件", file);
      // 判断图片格式
      const isType =
        file.type === "image/png" ||
        file.type === "image/jpg" ||
        file.type === "image/jpeg" ||
        file.type === "image/gif";
      // 判断上传图片大小
      const isLt2M = file.size / 1024 / 1024 < 2;
      if (!isType) {
        this.$message.error("上传图标只能为 jpg、png、gif、jpeg格式!!");
        return false;
      }
      if (!isLt2M) {
        this.$message.error("上传头像图片大小不能超过 2MB!");
        return false;
      }
      return isType && isLt2M;
    },
    //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用	function(file, fileList)
    change(file, fileList) {
      console.log("文件改变change");
      if (fileList.length >= 3) {
        this.isMax = true;
      }
    },
    //文件列表移除文件时的钩子 function(file, fileList)
    remove(file, fileList) {
      console.log("remove");
      if (fileList.length < 3) {
        this.isMax = false;
      }
    },
    //上传失败的时候钩子函数  会出现Bug,故在上传失败的时候也进行一下判断 function(err, file, fileList)
    error(err, file, fileList) {
      this.$message.error("上传失败");
      if (fileList.length >= 3) {
        this.isMax = true;
      } else {
        this.isMax = false;
      }
    },
    // 点击文件列表中已上传的文件时的钩子 function(file)
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      this.dialogVisible = true;
    },
  },
};
</script>

<style scoped>
::v-deep .avatar-uploader .el-upload {
  border: 1px dashed #5d5656;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
::v-deep .avatar-uploader .el-upload:hover {
  border-color: #409eff;
}
::v-deep .avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
::v-deep .avatar {
  width: 178px;
  height: 178px;
  display: block;
}
::v-deep .disabled .el-upload--picture-card {
  display: none;
}
</style>

<think> 我们正在处理一个关于在Vue 3Element Plus上传图片并获取图片base64格式的问题。根据引用[1]引用[2]的信息,我们可以总结出以下步骤: 1. 使用Element Plus的`ElUpload`组件,并配置相关属性(如禁止自动上传隐藏文件列表等)。 2. 通过`on-change`事件处理文件变化,在事件处理函数中获取文件对象。 3. 使用`FileReader`对象读取文件并将其转换为base64格式。 4. 将base64数据发送给服务器或者用于其他目的(如回显)。 引用[2]还展示了如何将base64字符串用于回显,即通过构建一个包含base64字符串的文件列表,并将其绑定到`ElUpload`组件的`file-list`属性上。 根据用户的问题,我们重点在于如何获取base64格式,因此我们主要关注第1、2、3步。 下面我们将详细说明实现步骤: ### 步骤1:配置Element Plus上传组件 在模板中,我们使用`el-upload`组件,并设置以下关键属性: - `action`:上传的服务器地址,但因为我们可能不需要自动上传(而是先转base64),所以可以设置为一个假地址(如`#`)或者留空。 - `auto-upload`:设置为`false`,禁止自动上传- `on-change`:绑定一个处理函数,当文件状态改变时(即用户选择了文件)触发。 - `show-file-list`:根据需求决定是否显示文件列表,如果仅上传一个图片且不需要列表,可以设置为`false`。 ### 步骤2:在`on-change`事件处理函数中处理文件 在`handleChange`函数中,我们可以获取到选中的文件。注意,`on-change`函数的参数是一个对象,其中`raw`属性是原始文件对象。 ### 步骤3:使用FileReader读取文件为base64 创建`FileReader`实例,读取文件并转换为base64字符串。读取完成后,在`onload`事件中获取结果(即base64字符串)。 ### 代码示例 以下是一个完整的Vue 3组件示例(使用Composition API): ```vue <template> <div> <el-upload action="#" :auto-upload="false" :on-change="handleChange" :show-file-list="false" > <el-button>选择图片</el-button> </el-upload> <!-- 如果需要预览,可以添加一个img标签 --> <img v-if="imageBase64" :src="imageBase64" alt="预览" style="max-width: 200px; margin-top: 20px;"> </div> </template> <script setup> import { ref } from 'vue'; const imageBase64 = ref(''); const handleChange = (file) => { // 注意:file.raw 是原始文件对象 const reader = new FileReader(); reader.onload = (e) => { // e.target.result 就是base64字符串 imageBase64.value = e.target.result; // 这里你可以将base64字符串发送给服务器,或者做其他处理 console.log('Base64:', imageBase64.value); }; reader.readAsDataURL(file.raw); }; </script> ``` ### 说明 - 当用户选择图片后,`handleChange`函数会被调用,传入的`file`参数是一个对象,其`raw`属性是File对象。 - 使用`FileReader`读取文件,通过`readAsDataURL`方法将文件转换为Data URL(即base64编码的字符串)。 - 读取完成后,`onload`事件触发,将结果赋值给`imageBase64`,这样我们就可以在模板中显示预览图,或者通过其他方式(如axios)发送给服务器。 ### 注意事项 - 如果服务器只需要base64数据(不含Data URL前缀),你可能需要从结果中去除前缀(如`data:image/png;base64,`)。但是,通常服务器端可以处理带有前缀的Data URL,所以根据实际情况决定。 - 如果上传大文件,base64字符串会很长,可能会影响性能,因此建议只在小图片的情况下使用。 ### 发送base64数据到服务器 如果你需要将base64数据发送给服务器,可以在`reader.onload`的回调函数中使用axios或其他HTTP库发送POST请求,例如: ```javascript import axios from 'axios'; // 在reader.onload回调中 axios.post('/upload', { image: imageBase64.value }) .then(response => { // 处理响应 }) .catch(error => { // 处理错误 }); ``` ### 相关问题 1. 如何限制上传文件的类型(例如只允许图片)? 2. 如何在上传前检查文件大小? 3. 如何实现多张图片上传并转换为base64? 4. 如何将base64字符串转换为文件对象并上传? 希望以上内容能帮助你解决问题。 </think>在 Vue 3 Element Plus上传图片并获取 base64 格式的实现方法如下: ### 实现步骤 1. **配置 Element Plus 上传组件** ```vue <template> <el-upload action="#" :auto-upload="false" :show-file-list="false" :on-change="handleFileChange" > <el-button>选择图片</el-button> </el-upload> <!-- 预览区域 --> <div v-if="imageBase64"> <img :src="imageBase64" alt="预览" style="max-height: 200px; margin-top: 20px"> <p>Base64 长度:{{ imageBase64.length }} 字符</p> </div> </template> ``` 2. **处理文件转换逻辑** ```javascript <script setup> import { ref } from 'vue'; const imageBase64 = ref(''); const handleFileChange = (uploadFile) => { const file = uploadFile.raw; // 获取原始文件对象 if (!file || !file.type.match('image.*')) { return alert('请选择图片文件'); } const reader = new FileReader(); reader.onload = (e) => { // 获取完整的base64字符串(含Data URL前缀) imageBase64.value = e.target.result; // 发送到服务器示例(使用axios) // axios.post('/upload', { image: imageBase64.value }) }; reader.onerror = (error) => { console.error('文件读取失败', error); }; // 启动读取 reader.readAsDataURL(file); }; </script> ``` ### 关键点说明 1. **文件读取流程**: - 通过 `FileReader` 的 `readAsDataURL()` 方法转换 - `reader.onload` 回调获取结果 - 结果格式为:`data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...` 2. **Element Plus 配置**: - `:auto-upload="false"`:禁用自动上传 - `:on-change`:文件选择时触发 - `uploadFile.raw`:获取原生 File 对象 3. **服务器传输**: ```javascript // 发送base64到服务器示例 axios.post('/api/upload', { imageData: imageBase64.value.split(',')[1] // 去除前缀 }, { headers: {'Content-Type': 'application/json'} }) ``` ### 完整组件示例 ```vue <template> <div class="upload-demo"> <el-upload action="#" accept="image/*" :limit="1" :auto-upload="false" :show-file-list="false" :on-change="handleChange" > <el-button type="primary">点击上传</el-button> <template #tip> <div class="el-upload__tip">支持 JPG/PNG 格式图片</div> </template> </el-upload> <div v-if="previewUrl" class="preview-container"> <img :src="previewUrl" class="preview-image"> <el-button @click="submitImage">提交到服务器</el-button> </div> </div> </template> <script setup> import { ref } from 'vue'; import axios from 'axios'; const previewUrl = ref(''); const handleChange = (file) => { const reader = new FileReader(); reader.onload = (e) => { previewUrl.value = e.target.result; }; reader.readAsDataURL(file.raw); }; const submitImage = async () => { try { const response = await axios.post('/api/upload', { // 去除Data URL前缀 image: previewUrl.value.replace(/^data:image\/\w+;base64,/, '') }); console.log('上传成功', response.data); } catch (error) { console.error('上传失败', error); } }; </script> <style> .preview-container { margin-top: 20px; text-align: center; } .preview-image { max-width: 300px; max-height: 300px; display: block; margin: 0 auto 15px; } </style> ``` ### 注意事项 1. **文件大小限制**:base64会使文件体积增大约33%,建议限制图片大小(可在`before-upload`钩子中添加校验) 2. **安全性**:直接渲染base64时注意XSS防护 3. **前缀处理**: - 包含前缀:`data:image/png;base64,...` 可直接用于`<img src>` - 仅base64:传输到服务器时建议去除前缀 4. **性能优化**:大文件建议使用分片上传替代base64 [^1]: [Element Plus文件上传组件配置](https://element-plus.org/zh-CN/component/upload.html) [^2]: [FileReader API文档](https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值