上传接口收到的 iPhone 照片,HEIC 显示不了还带着定位,后端都是怎么处理的?

很多上传接口写的时候,测试素材是电脑桌面上随手拖的几张 JPEG、PNG,跑通就上线了。等手机用户多起来,两类反馈会陆续出现:有的是图传上去了,页面上却是个裂图;还有的更麻烦,有人发现自己发的图能被读出拍摄地点。两件事都跟 iPhone 拍出来的原图有关,处理的位置也都在服务端。

格式:别信前端报上来的类型

MDN 的 Image file type and format guide(10 月的版本)列了网页上常用的图片格式:APNG、AVIF、GIF、JPEG、JPEG XL、PNG、SVG、WebP,HEIC 不在其中。用户传上来一张 HEIC,前端直接拿 <img> 预览,能不能显示要看浏览器,别当成默认可用。

判断格式也别靠 file.type。MDN 在 Blob.type 那页写得很清楚:浏览器不会读文件的字节流,只按扩展名推断类型,遇到少见的后缀会返回空字符串,开发者不应该拿它当唯一的校验手段。稳一点的做法是服务端自己读内容:交给图片库解码一次,解不开就拒掉,能解开再统一转码。

存成 JPEG 还是 WebP,各家习惯不同。MDN 的建议是位图优先用 WebP 或 AVIF,照片类需要兜底时用 JPEG。原图要不要留,看业务需要。留的话放在不对外的存储里,页面上展示的一律走转码后的版本。

定位:在服务端统一剥掉

Apple 的 iPhone 使用手册 Share photos and videos on iPhone(iOS 27 版)里写着:分享照片或视频时会连带发出它的元数据,包括日期和时间、位置、设备、说明文字。用户从相册选图传到网页,文件里有没有 GPS,后端没法预知,只能按“可能有”来处理。

服务端要做的是:对外展示的图,EXIF 里至少把 GPS 去掉,省事的话整段元数据都不要。不少图片库转码时可以选择不写回元数据,但默认行为各不相同,转完拿工具读一遍输出文件,确认里面确实没有位置字段。还有个小坑:有些图是靠 EXIF 里的方向信息摆正的,元数据一删,显示出来可能就横着了。所以要先按这个方向把像素转正,再清掉 EXIF。

头像、帖子配图、商品图这类公开展示的场景,这一步最好做成上传流程里的固定环节,别指望用户自己处理。

用户那边能做什么

帮助页里可以给用户写几句,不过 Apple 自己的两份文档在这件事上说法对不上,动笔前最好拿真机点一遍:

  • Apple 个人安全使用手册里的 Manage location metadata in Photos(2026 年 9 月发布)写着:在照片 App 里选中要发的图,点分享,再点 Options,关掉 Location,面板上方会显示 Location Not Included。
  • iOS 27 版的 iPhone 使用手册讲分享时的 Options,只列了 Keywords、文件格式(Automatic、Current、Most Compatible,选 Most Compatible 可能转成 JPEG 或 MOV)和 All Photos Data 三项,没有提到位置开关。
  • 个人安全手册另外给了两条路:单张照片在信息里点 Adjust Info,再点 Adjust Location,选 No Location。以后都不想记录位置,就到 Settings > Privacy & Security > Location Services > Camera,选 Never。中文界面里对应的名称以手机上显示的为准。

所以 iOS 27 的分享面板里到底还有没有位置开关,目前只能说个人安全那份写了有,iPhone 那份没提。服务端剥元数据这一步不受影响,照做就行。

你们的上传接口是转码时顺手丢掉元数据,还是单独有一步清理?HEIC 这块有没有碰到过解码库不支持的情况?