html:
<a-upload
v-model:file-list="fileList"
list-type="picture-card"
:before-upload="beforeUpload"
@change="handleChange"
:show-upload-list="false"
:customRequest="customImageRequest"
>
<div class="upload-box" v-if="imageUrl">
<img :src="imageUrl" alt="avatar" />
<div class="delete" @click="delteImg">
<DeleteOutlined />
</div>
</div>
<div v-else>
<plus-outlined />
<div class="ant-upload-text">上传签名</div>
</div>
</a-upload>
js:
// 图片压缩成base64 function getBase64(img: Blob, callback: (base64Url: string) => void) { const reader = new FileReader(); reader.addEventListener('load', () => callback(reader.result as string)); reader.readAsDataURL(img); }
const fileList = ref([]);
// 上传文件改变时的状态 const handleChange = (info: any) => { if (info.file.status === undefined) { fileList.value = fileList.value.filter((item, index) => { return index < fileList.value.length - 1; }); } if (info.file.status === 'uploading') { loading.value = true; return; } if (info.file.status === 'error') { loading.value = false; message.error('upload error'); } };
// 上传文件之前的钩子,参数为上传的文件,若返回 false则停止上传。支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传,resolve 时开始上传( resolve 传入 File或 Blob对象则上传 resolve 传入对象)。注意:IE9 不支持该方法。 const beforeUpload = (file: FileItem) => { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/tiff' || file.type === 'image/jpg'; if (!isJpgOrPng) { message.error('请上传jpeg,png,tiff,jpg格式图片'); return false; } const isLt2M = file.size / 1024 / 1024 < 10; if (!isLt2M) { message.error('上传图片太大,已超出10M'); return false; } return true; };
// 通过覆盖默认的上传行为,可以自定义自己的上传实现(只写了前端没有写请求) const customImageRequest = (info:any)=>{ const { file } = info; getBase64(file, (base64Url: string) => { imageUrl.value = base64Url; }); setTimeout(()=>{ loading.value = false; }) };
// 删除图片 const delteImg = (e:Event)=>{ e.stopPropagation(); imageUrl.value = ''; };