element-ui的upload上传图片校验图片的宽高

本文介绍如何使用Element-UI的upload组件进行图片上传,并在校验图片格式、大小的基础上,增加对图片宽度和高度的校验,确保上传图片符合特定比例要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用element-ui的upload上传图片,官方文档中提供了在beforePicUpload中校验图片格式和大小的方法,但是没有提供校验宽高方法。

需求:
在开发的过程中,我们可能需要限制图片的width和heigth相同,也可能需要限制width比height长,还有可能需要限制height比width长。

解决方法:

beforePicUpload (file) {
      let _this = this
      const isJPG = file.type === 'image/jpeg' || 'image/png'
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isJPG) {this.$Mint.Toast('上传图片只能是jpg或者png格式!')}
      if (!isLt2M) {this.$Mint.Toast('上传图片大小不能超过2MB!')}
      const isSize = new Promise(function (resolve, reject) {
        let _URL = window.URL || window.webkitURL
        let img = new Image()
        img.onload = function () {
          let valid = img.width < img.height
          valid ? resolve() : reject()
        }
        img.src = _URL.createObjectURL(file)
      }).then(() => {
        return file
      }, () => {
        _this.$Mint.Toast({
          message: '请上传竖屏的图片!'
        })
        return Promise.reject()
      })
      return isJPG && isLt2M && isSize
    }

如果需要上传横屏的,只需更改以下部分:

let valid = img.width > img.height

那,如果我们想要用户上传宽高相等的怎么操作呢?

beforePicUpload (file) {
      let _this = this
      const isJPG = file.type === 'image/jpeg' || 'image/png'
      const isLt2M = file.size / 1024 / 1024 < 2
      if (!isJPG) {this.$Mint.Toast('上传图片只能是jpg或者png格式!')}
      if (!isLt2M) {this.$Mint.Toast('上传图片大小不能超过2MB!')}
      const isSize = new Promise(function (resolve, reject) {
      	let width = 500
        let height = 500
        let _URL = window.URL || window.webkitURL
        let img = new Image()
        img.onload = function () {
          let valid = img.width === width && img.height === height
          valid ? resolve() : reject()
        }
        img.src = _URL.createObjectURL(file)
      }).then(() => {
        return file
      }, () => {
        _this.$Mint.Toast({
          message: '上传图片长宽需为500*500!!'
        })
        return Promise.reject()
      })
      return isJPG && isLt2M && isSize
    }
<think>嗯,用户想用element-ui实现单张图片上传和实预览。首先,我得回忆一下element-ui的组件。记得Upload组件可以处理文件上传,但预览可能需要配合其他组件。 用户提到的是单张图片,所以可能需要限制上传数量为1,并且在上传后替换旧图片。需要设置action属性,指向后端的接口地址。不过如果是测试,可能先设为"#",暂不处理上传逻辑。 然后是预览部分。用户上传图片后,需要立即显示预览。可以用el-image组件来展示图片,结合缩略图功能。可能需要用到file-list属性来获取上传的文件列表,然后提取URL。 另外,用户可能需要点击图片放大查看。记得element-ui的el-image-viewer可以实现图片预览,但官方文档中好像没有直接导出这个组件,可能需要按需引入。比如使用import('element-ui/packages/image/src/image-viewer')来动态加载。 还需要处理删除功能,当用户点击删除图标,清空已上传图片。可能需要监听on-remove事件,并更新fileList为空数组。 要注意的是,上传前可能需要校验文件类型,比如只允许jpg、png等图片格式。可以用before-upload钩子函数,检查文件类型,并给出提示。 另外,样式方面,可能需要调整上传按钮和预览图片的布局,使用flex布局让它们水平排列。限制上传组件的显示方式为图片卡片,并隐藏文件列表,通过自定义的缩略图来展示。 可能遇到的问题包括:图片预览不显示,可能是因为file-list中的url没有正确生成。需要使用URL.createObjectURL方法来创建本地预览链接。同,记得在组件销毁释放这些URL,避免内存泄漏。 还有,用户可能希望在上传后,后端返回的图片地址也能显示出来,这候可能需要在上传成功的回调中更新fileList,但如果是单张图片,可能需要替换现有的文件。 总之,步骤大概是:配置el-upload组件,处理上传前后的钩子,生成预览URL,使用el-image显示图片,并集成el-image-viewer实现点击放大。同处理删除和文件类型校验。</think>根据Element-UI组件库特性,实现单图片上传及预览功能可按照以下步骤进行: ### 一、基础组件配置 ```html <el-upload action="#" list-type="picture-card" :show-file-list="false" :on-success="handleSuccess" :before-upload="beforeUpload"> <img v-if="imageUrl" :src="imageUrl" class="preview-image"> <i v-else class="el-icon-plus"></i> </el-upload> ``` ### 二、关键参数说明 1. `list-type="picture-card"` 设置卡片式图片上传样式 2. `:show-file-list="false"` 隐藏默认文件列表 3. 使用`imageUrl`变量存储Base64格式的预览图 ### 三、核心方法实现 ```javascript data() { return { imageUrl: '' } }, methods: { beforeUpload(file) { const isImage = /^image\/(jpeg|png|gif|webp)$/.test(file.type) if (!isImage) { this.$message.error('仅支持JPG/PNG/GIF格式') } return isImage }, handleSuccess(res, file) { this.imageUrl = URL.createObjectURL(file.raw) }, // 图片预览方法(需在components中注册el-image-viewer) handlePreview() { this.$refs.previewDialog.show() } } ``` ### 四、图片放大功能 添加预览对话框组件: ```html <el-dialog :visible.sync="previewVisible" width="60%"> <el-image-viewer v-if="previewVisible" :url-list="[imageUrl]" @close="previewVisible = false"/> </el-dialog> ``` ### 五、样式优化建议 ```css .preview-image { width: 148px; height: 148px; object-fit: contain; } .el-upload--picture-card { border: 1px dashed #d9d9d9; display: inline-flex; align-items: center; } ``` ### 六、注意事项 1. 生产环境需替换`action`为真实上传接口 2. 使用`URL.revokeObjectURL()`释放内存[^2] 3. 可添加`on-exceed`处理多文件限制[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值