必须用 uni.getimageinfo 获取真实分辨率校验,返回实际宽高且不受 css 影响;需在 chooseimage 后、上传前逐张异步执行,失败则拒绝上传;长边阈值(如 1200px)与比例(如微信封面 5:4)须同时校验,压缩后仍需 getimageinfo 获取尺寸。

uni.getImageInfo 获取真实分辨率再校验
不能只靠文件名或用户声称的尺寸,必须用 uni.getImageInfo 读取图片元数据。它返回的是实际宽高(res.width / res.height),不是渲染尺寸,也不受 CSS 影响。
- 调用时机:必须在
uni.chooseImage成功后、上传前执行,且需逐张校验(多图场景下别漏掉) - 注意异步:
uni.getImageInfo是异步 API,不能直接写在tempFilePaths循环里用同步逻辑判断 - 失败兜底:若
getImageInfo失败(如路径无效、iOS 沙盒限制),应视为不合规,拒绝上传而非跳过
设定宽高阈值并统一处理比例
业务常要求“不超过 1200×1200”,但用户可能上传超宽窄图(如 3000×200)或超高瘦图(如 200×3000)。单纯比最大边不够,得同时约束长边和短边,或按比例缩放后再判。
- 推荐做法:先计算长边
Math.max(width, height),再与上限比较;若超限,提示“图片最长边不得超过 XXX 像素” - 比例敏感场景(如微信分享封面):用
width / height计算比值,容忍 ±0.01 浮点误差,避免因四舍五入误判 - 不要用
Math.round()强制取整再比——原始像素值是整数,round 反而引入偏差
压缩后再校验,避免二次读取开销
如果流程中已用 uni.compressImage 压缩(比如限宽 1200px),那校验应放在压缩成功回调里,而不是对原图重复调用 getImageInfo。
- 压缩参数要明确:设置
width: 1200或quality: 0.7,否则压缩结果不可控 - 压缩后仍需
getImageInfo:因为uni.compressImage的success回调只返回路径,不带尺寸信息 - 真机注意:Android 部分低端机型压缩后宽高可能有 1–2px 偏差,校验时留 2px 容差更稳妥
小程序平台特别限制:微信封面图必须 5:4
微信小程序分享封面不是“建议”而是硬性规则,比例不符会触发后台自动压缩,导致模糊。这不是前端能绕过的,必须前置拦截。
- 校验代码示例:
Math.abs(width / height - 1.25) ,别用 <code>===直接比浮点数 - 尺寸建议:严格按 750×600 或等比缩放(如 375×300),别用 800×640 这类看似接近但实际被拒的尺寸
- H5 和 App 端无需此限制,但若共用同一套上传逻辑,需加平台判断:
uni.getSystemInfoSync().platform === 'mp-weixin'
实际限制分辨率这事,关键不在“怎么读尺寸”,而在“什么时候读、读哪张图、读完怎么反馈”。很多人把校验塞在选择后立刻执行,却忘了压缩环节会生成新路径——那张图才是最终上传对象,原图尺寸早就不作数了。











