vue3 el-upload实现上传图片为base64格式并存储进表单

在这里插入图片描述在这里插入图片描述

一、template

<el-form-item label="图片" prop="images">
            <el-upload
              action="#"
              :accept="['image/jpeg', 'image/png', 'image/gif'].join(',')"
              list-type="picture-card"
              :auto-upload="true"
              :on-change="handleUploadChange"
              :before-upload="beforeUpload"
              :file-list="fileList"
              :http-request="customUpload"
              :on-remove="handleRemove"
              :on-preview="handlePictureCardPreview"
            >
              <el-icon><Plus /></el-icon>
            </el-upload>
          </el-form-item>
......
......
......
<el-dialog v-model="imgVisible" style="wigth: 60%; height: auto">
    <img :src="dialogImageUrl" alt="Preview Image" style="width: 100%" />
 </el-dialog>

二、js

import { Plus } from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus'
import type { UploadProps } from 'element-plus'
......
......
......
const fileList = ref<Array<{ name: string; url: string }>>([]) // 用于显示已上传的图片列表(最多1张)

// 限制上传文件类型和大小
const beforeUpload = (file) => {
  const isImage = file.type.startsWith('image/')
  const isLt2M = file.size / 1024 / 1024 < 2

  if (!isImage) {
    ElMessage.error('只能上传图片文件!')
  }
  if (!isLt2M) {
    ElMessage.error('图片大小不能超过2MB!')
  }
  return isImage && isLt2M
}

// 自定义上传逻辑
const customUpload = async (options) => {
  const file = options.file
  return new Promise((resolve) => {
    const reader = new FileReader()
    reader.onload = (e) => {
      formData.value.images = e.target.result // 将Base64存入formData
      fileList.value = [
        {
          name: file.name, // 保留文件名
          url: e.target.result as string // 完整的 Base64 URL
        }
      ] // 更新文件列表(仅1张)
      resolve(true)
    }
    reader.readAsDataURL(file) // 转换为Base64
  })
}

// 处理文件变化(可选)
const handleUploadChange = (file) => {
  console.log('当前文件:', file)
}

// 处理删除操作
const handleRemove = () => {
  formData.value.images = '' // 清空Base64数据
  fileList.value = [] // 清空文件列表
}
const dialogImageUrl = ref('')
const imgVisible = ref(false)
const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => {
  dialogImageUrl.value = uploadFile.url!
  imgVisible.value = true
}

注意:在open表单的方法里初始化 fileList(编辑时回显图片)

// 初始化 fileList(编辑时回显图片)
      if (formData.value.images) {
        fileList.value = [{ url: formData.value.images }]
      }

注意:在需要的地方置空图片(例如关闭弹窗时)

 fileList.value = [] // 清空 fileList
### 如何在 Vue 项目的 `el-upload` 组件中实现图片上传前添加水印 为了实现在使用 Element UI 的 `el-upload` 组件之前给图片添加水印的功能,可以采用前端处理的方式,在文件被选中但还未上传时对其行修改。具体来说,可以通过监听 `beforeUpload` 钩子函数来操作图像数据。 #### 主要思路 当用户选择了待上传图片之后,先阻止默认的上传行为,利用 HTML5 Canvas API 对原始图片绘制加入自定义的文字或图案作为水印,最后再将带有水印的新图片对象传递给服务器[^3]。 #### 实现方法 1. **引入必要的依赖** 如果还没有安装 canvas 相关库的话,建议先安装一个方便使用的 npm 包比如 `canvas` 或者直接使用浏览器内置的支持即可满足需求。 2. **创建画布设置参数** ```javascript function addWatermark(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.readAsDataURL(file); reader.onloadend = () => { let img = new Image(); img.src = reader.result; img.onload = function() { // 创建Canvas元素用于绘图 var canvas = document.createElement(&#39;canvas&#39;); var ctx = canvas.getContext(&#39;2d&#39;); // 设置Canvas尺寸等于原图大小 canvas.width = img.width; canvas.height = img.height; // 把原图画到Canvas上 ctx.drawImage(img, 0, 0); // 定义水印文字样式 ctx.font = "48px serif"; ctx.fillStyle = &#39;rgba(255, 255, 255, .7)&#39;; ctx.textAlign = &#39;right&#39;; ctx.textBaseline = &#39;bottom&#39;; // 在指定位置写入水印文字 ctx.fillText("Sample WaterMark", img.width - 20, img.height - 20); resolve(canvas.toDataURL()); } }; }); } ``` 3. **集成至 el-upload 中** ```html <template> <div id="app"> <!-- 使用ElementUI的upload组件 --> <el-upload action="#" :before-upload="handleBeforeUpload" list-type="picture-card"> <i class="el-icon-plus"></i> </el-upload> </div> </template> <script> export default { methods: { async handleBeforeUpload(rawFile) { try { const watermarkedImageURL = await addWatermark(rawFile); // 获取带水印后的base64编码字符串 // 这里可以根据实际业务逻辑继续处理,例如转换成Blob对象重新赋值给fileList属性, // 或者直接发送请求上传base64格式的数据。 console.log(watermarkedImageURL); alert(&#39;已成功添加水印!&#39;); return false; // 返回false防止自动提交表单触发默认上传动作 } catch (error) { console.error(error); throw error; } } } }; </script> ``` 上述代码展示了如何通过 JavaScript 和 HTML5 Canvas 来动态地向选定的照片添加简单的白色半透明文本形式的水印,且暂停了原本由 `el-upload` 发起的真实HTTP POST 请求直到开发者决定何时以及怎样去执行真正的上传过程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值