CodeIgniter 中可直接调用 PHP 原生 exif_read_data(),但需满足:PHP 启用 exif 扩展、传入本地绝对路径(如 $upload_data['full_path'])、图片为 JPEG/TIFF 且含 EXIF 数据。

CodeIgniter 本身不内置 EXIF 解析能力,exif_read_data() 是 PHP 原生函数,只要 PHP 编译时启用了 exif 扩展,就能直接用 —— 不需要额外装 CodeIgniter 插件或库。
PHP exif_read_data() 在 CodeIgniter 中能直接调用吗
能,但有前提:
- 服务器 PHP 必须启用
exif扩展(检查phpinfo()是否含exif support => enabled) - 上传后的图片路径必须是服务端可读的本地绝对路径(不能是 URL 或未保存的临时流)
- CodeIgniter 的上传类默认会重命名文件,记得用
$upload_data['full_path']而不是$upload_data['file_name']
示例片段:
$this->load->library('upload', $config);
if ($this->upload->do_upload('userfile')) {
$upload_data = $this->upload->data();
$exif = exif_read_data($upload_data['full_path'], 'EXIF'); // 注意第二个参数限定只读 EXIF 段
if ($exif && isset($exif['DateTimeOriginal'])) {
echo $exif['DateTimeOriginal']; // 如:2026:04:21 10:33:15
}
}
为什么 exif_read_data() 返回空或 Warning
常见原因和对应动作:
-
Warning: exif_read_data(...): File not supported→ 文件不是 JPEG/TIFF,或头部损坏;先用exif_imagetype()校验:if (exif_imagetype($path) !== IMAGETYPE_JPEG) { ... } - 返回空数组但无报错 → 图片不含 EXIF 段(如被 PS 导出时勾选了“删除元数据”、或 GD 库 resize 后未保留)
- 读到
Orientation却是 1,但图片仍显示歪 → 实际是浏览器/APP 自动旋转渲染,EXIF 里的Orientation值没被消费;CodeIgniter 后端读取只是获取值,不自动修正图像 - 权限问题:确保 web 用户(如 www-data)对图片文件有读权限
GD 库缩图后 EXIF 丢失怎么办
GD 的 imagejpeg() 默认不写入 EXIF 数据,缩图即丢元数据。要保留,得手动提取再写入:
- 缩图前用
exif_read_data($src, 0, true)读全段(第三个参数true表示按段分组) - 缩图后用
imagejpeg($im, $dst, $quality)保存基础图 - 再用第三方工具(如
exiftoolCLI)把原图 EXIF 注入新图:exec("exiftool -TagsFromFile {$src} -all:all {$dst} 2>&1", $out) - 纯 PHP 方案极复杂(需解析 JPEG APP1 段并重写),不推荐;轻量级场景建议改用
imagick扩展,它支持$imagick->setImageProperty()和保留原始 EXIF
移动端上传照片 Orientation 错乱的应对逻辑
iPhone/Android 竖拍常存 Orientation = 6,但浏览器显示正常 —— 这是前端行为,后端读到的仍是原始像素布局。处理建议:
- 读取
$exif['Orientation'],若为 6/8/3,说明需旋转;用 GD 的imagerotate()预处理后再保存 - 别依赖
exif_read_data()的THUMBNAIL段,手机相册图往往没内嵌缩略图 - 注意:旋转操作会改变图像宽高,
imagerotate()返回新资源,记得释放原资源:imagedestroy($src_im) - 如果只是想“正确显示”,更优解是在前端用
exif-js读 Orientation 并 CSS transform,避免后端无谓计算
EXIF 不是必读字段,很多用户截图、网页保存的图根本没这数据;实际业务中,优先校验 exif_imagetype() 和 isset($exif['DateTimeOriginal']) 再分支处理,比强依赖更稳妥。


















