必须手动清除EXIF中GPS等敏感信息,前端用FileReader读ArrayBuffer后通过piexifjs清理再构造Blob;服务端才是唯一可信环节,需校验类型并针对性剥离JPEG/PNG中的元数据。

上传前用 FileReader 读取 ArrayBuffer 再丢弃 EXIF
浏览器里无法“自动抹除”位置信息,必须手动干预。关键不是上传时设置什么属性,而是上传前把原始文件的 EXIF 元数据干掉。最稳妥的做法是:用 FileReader 把 input[type="file"] 选中的 File 对象读成 ArrayBuffer,再用 piexifjs 或类似库清空 GPS tag,最后构造新 Blob 替换原文件。
常见错误是直接传 files[0] 给 fetch——这样后端收到的就是带完整 GPS 的原始二进制流,前端任何 JS 都没机会动它。
- 别依赖
canvas.toBlob()隐式清除:它确实会丢 EXIF,但只适用于 JPEG;PNG 不受影响,且 canvas 会强制转码、可能降低画质或放大体积 -
piexifjs.remove()是最轻量的选择,一行就能删光所有 EXIF(包括 GPS、时间、设备型号),但注意它不支持 WebP 和 HEIC - 如果要保留版权信息等非敏感字段,得用
piexifjs.insert()手动拼接新 EXIF,而不是“删除部分字段”——EXIF 结构不支持局部擦除
服务端才是 EXIF 清理的唯一可信环节
前端清理只是用户体验优化,不能当真。用户禁用 JS、绕过表单、用 curl 直传,都能把原始文件连同 GPS 一起送上来。真正可靠的处理必须落在服务端。
Python 后端推荐用 Pillow + piexif,Node.js 推荐 exifr + jpeg-js,两者都能在解析后明确控制是否写回 EXIF:
- 接收上传后,先校验
content-type是否为image/jpeg或image/png,拒绝其他类型 - 对 JPEG:用
piexif.remove()清空整个 EXIF 段,再用Image.save(..., exif=b'')强制不写入 - 对 PNG:EXIF 不是标准字段,但部分工具会塞进
iTXt或自定义 chunk,需用PngImagePlugin扫描并剔除 - 别信“上传时加 header 就能 strip”这种说法——HTTP header 对文件内容零影响
移动端拍照上传时 GPS 更容易残留
iOS 和安卓相机 App 默认开启地理位置记录,生成的 JPG 几乎都带 GPS tag。更麻烦的是:有些手机在“设置 > 隐私 > 定位服务”里关了相机权限,但已拍照片的 EXIF 仍含历史坐标。
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
前端可做一层防御性处理:
- 监听
change事件后,立刻检查files[0].name是否含IMG_或DCIM,这类命名大概率来自手机相册,触发 EXIF 扫描逻辑 - 用
exifr快速读 GPS 字段:exifr.gps(files[0]),有返回值就说明存在,再走清理流程 - 别在用户点击“上传”按钮时才处理——应该在
change后立即读取并替换files,否则预览图和上传文件不一致 - Android WebView 和旧版 Safari 对
FileReader.readAsArrayBuffer()支持不稳定,需 fallback 到readAsDataURL()+ base64 解码,但性能差很多
别把“抹除位置”和“加密图片”混为一谈
所谓“EXIF 加密”在工程中基本不存在。加密需要密钥分发、解密逻辑、兼容性保障,而 GPS 坐标本身不是要保护的内容,是要彻底拿掉的东西。
真实需求只有三个层次:
- 去标识化:把
GPSLatitude和GPSLongitude设为0/0,或四舍五入到小数点后两位(保留城市级精度,去掉街道级) - 最小化留存:只留
Copyright、DateTime(截断到天),其余全删 - 访问控制:敏感字段(如 GPS)不存进图片文件,单独入库,读取时按权限动态拼接
最常被忽略的一点:CDN 或对象存储(如 AWS S3、Cloudflare Images)往往自带 EXIF 自动剥离功能,开启后比自己写逻辑更稳——但必须确认它是否覆盖所有图片格式,以及是否在缩略图生成阶段也生效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










