el-upload(封装图片上传功能)

1.1 封装上传组件:ImageUpload

<template>
  <el-upload
    :http-request="uploadImage"
    with-credentials
    list-type="picture-card"
    :limit="limit"
    :on-preview="handlePreview"
    :on-remove="handleRemove"
    :on-exceed="handleExceed"
    :before-upload="beforeUpload"
    :file-list="fileList"
  >
    <el-icon><Plus /></el-icon>
  </el-upload>

  <el-dialog v-model="dialogVisible">
    <div class="dialog-img">
      <img :src="dialogImageUrl" alt="预览图片" />
    </div>
  </el-dialog>
</template>

<script lang="ts" setup>
import { ElMessage } from "element-plus"
import type { UploadProps, UploadUserFile } from "element-plus"
import { uploadFile } from "@/api/common"
import { uploadCodeStr } from "@/types/common"

const props = defineProps({
  accept: {
    type: String,
    default: ".jpg,.jpeg,.png"
  },
  limit: {
    type: Number,
    default: 1
  },
  fileList: {
    type: Array,
    default: () => []
  },
  fileSize: {
    type: Number,
    default: 3
  },
  noSizeLt: {
    type: Boolean,
    default: false
  },
  uploadCode: {
    type: String,
    default: uploadCodeStr
  }
})

const emits = defineEmits(["remove", "success", "exceed"])

const dialogImageUrl = ref("")
const dialogVisible = ref(false)

const handlePreview: UploadProps["onPreview"] = (uploadFile) => {
  dialogImageUrl.value = uploadFile.url!
  dialogVisible.value = true
}

const handleRemove: UploadProps["onRemove"] = (uploadFile, uploadFiles) => {
  emits("remove", uploadFile, uploadFiles)
}

const handleExceed: UploadProps["onExceed"] = (files, uploadFiles) => {
  ElMessage.warning(`只能上传 ${props.limit} 张图片`)
  emits("exceed", files, uploadFiles)
}

// 文件格式和大小校验
const beforeUpload = (file: File) => {
  const isImage = /\.(jpg|jpeg|png)$/i.test(file.name)
  const isLt3M = file.size / 1024 / 1024 < props.fileSize
  if (!props.noSizeLt && !isLt3M) {
    ElMessage.error(`图片大小不能超过 ${props.fileSize} MB!`)
    return false
  }
  if (!isImage) {
    ElMessage.error("仅支持 JPG、JPEG、PNG 格式的图片!")
    return false
  }

  return true
}

const uploadImage = async (file) => {
  let UploadFormData = {
    multipartFile: file.file,
    code: props.uploadCode
  }
  const res = await uploadFile(UploadFormData)
  if (res.code && res.code === "200") {
    emits("success", res.data, file.file)
  } else {
    ElMessage.error(res.msg || "未知错误")
  }
}
</script>

<style scoped>
.el-upload--picture-card {
  display: flex;
  justify-content: center;
  align-items: center;
}
.dialog-img {
  height: 100%;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
.dialog-img img {
  width: 100%;
  height: 100%;
}
</style>

请求调用上传接口,返回url , 存到form的字段上 

1.2 使用组件

 <ImageUpload :fileList="logoFileList" @success="handleSuccess" @remove="handleRemove" />



  /**
   * 上传成功
   * @param response
   * @param file
   * @param fileList
   */
  const handleSuccess = (response: { relativePath: string; absolutePath: string }) => {
    console.log("上传成功:", response.relativePath)
    createForm[EFormPropKeys.LOGO] = response.relativePath
  }

  const handleRemove = () => {
    createForm[EFormPropKeys.LOGO] = ""
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值