vue3封装图片上传组件的两种方式

该篇博客详细介绍了如何使用ElementPlus的el-upload组件和HTML的input[type=file]实现图片上传功能,包括限制上传数量、文件类型及大小检查,并提供了上传成功后的处理逻辑和清空内容的方法。同时,展示了两种不同方式的文件选择与上传流程,适用于前端开发中的图片上传场景。
摘要由CSDN通过智能技术生成

1、使用element plus中的 el-upload实现图片上传
template

<div class="front upload-item">
	<el-upload
	:limit="1"
	action="#"
	list-type="picture"
	:auto-upload="false"
	accept="image/png,image/gif,image/jpg,image/jpeg"
	:on-success="handleSuccess"
	:on-change="imgSaveToUrl"
	:show-file-list='false'
	ref='frontUpload'
	>
	<img  class="icon-img" v-if='imageFrontUrl' :src="imageFrontUrl"/>
	<img  class="icon-img" v-else src="@/assets/defaultImg.png"/>
</el-upload>

script

const imageFrontUrl = ref('')
function imgSaveToUrl (file) {
	imageFrontUrl.value = URL.createObjectURL(file.raw)
	const fileSize = file.size
	const fileType = file.raw.type
	if (!fileSize) {
	// 是否为空
		ElMessage({
            type: 'error',
            showClose: true,
            message: '无效的文件,请重新选择!',
        })
		logoPicRemove()
		return
	}
	if (fileSize / 1024 / 1024 > 10) {
	// 图片大小
	  ElMessage({
            type: 'error',
            showClose: true,
            message: '请上传小于10M的图片!',
        })
        logoPicRemove()
		return
	}
	if (fileType.indexOf('image') === -1) { 
	// 如果不是图片格式
		ElMessage({
            type: 'error',
            showClose: true,
            message: '不是有效的图片文件,或格式不支持,请重新选择!',
        })
		logoPicRemove()
		return
	}
		imageUpload(file)
	}

function logoPicRemove() { // 清空内容
	frontUpload.value.clearFiles()
	imageFrontUrl.value = ''
}
async function imageUpload (file) {
  let res = await axios.post({
   ........ 
  })
}

2、使用input的type="file"来实现
template

<template>
  <div  @click.capture.stop="handle_doUpload">
    <input
      type="file"
      accept="image/*"
      ref="getFile"
      @change="handle_choseFile"
    />
  </div>
</template>

script

const emit = defineEmits(['update:fileUrl'])
defineProps({
  fileUrl: {
    type: String,
    default: ""
  },
})

const getFile = ref(null)
function handle_doUpload() {
  getFile.value.click()
}
async function handle_choseFile(e) {
  let file = getFile.value.files[0]
  if (file.size > 10 * 1024 * 1024) {
    // 文件大小超限了
    ElMessage.closeAll()
    ElMessage({
      type: 'error',
      showClose: true,
      message: '请上传小于10M的图片'
    })
    getFile.value.value = '' // 清空内容
    return
  }
  let forms = new FormData()
  forms.append('file', file)
  forms.append('filePath', `pc/client-${moment().format('YYYY-MM-DD')}/`)
  getFile.value.value = '' // 清空内容
  let res = await axios.post({
   ........
  })
  if (res) {
    emit("update:fileUrl", res.data) // 其他操作
  }
}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Smile_zxx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值