首页 > 解决方案 > PHP 在从客户端上传到服务器时保留 .jpg 元数据

问题描述

场景:照片编辑人员在其客户端计算机上准备 .jpg 图像文件,包括在每个图像上指定 IPTC 元数据版权、描述和署名值。然后必须通过基于 PHP 的图像上传网页将图像上传到服务器。问题:元数据在 PHP 进程上传期间被剥离!(注意:如果图片是通过 FileZilla FTP 上传的,元数据会原封不动地到达并且可以被 PHP 代码读取。)

我考虑过使用 ImageMagick 进程而不是默认的 GD 库,但两者都没有在上传的图像上显示元数据。我考虑过 EXEC(ExifTool...),但它也有同样的问题——它只会查看服务器的已被剥离的图像副本。元数据无法提取到客户端计算机上的隐藏表单字段中,然后通过 PHP 重新加入图像文件,因为(再次)PHP 只查看服务器端文件副本,并且元数据在到达时已经被剥离。我还希望避免将图像作为 blob 存储在 MySQL 数据库中。这就是为什么我首先尝试使用元数据,因此照片管理器可以离线进行所有图像准备并封装标题,图像文件本身中的版权和署名信息,并期望它在图像中不受干扰地传播。(我很惊讶地发现 PHP 假定它应该在图像上传期间删除元数据而没有追索权!)

PHP 有没有办法使用 PHP 代码执行基于 FTP 的文件传输?我愿意接受这种方式或任何其他方式来获取文件的服务器副本,以将原始元数据包含在其 imageA 的副本中。TIA

PS——我没有包含代码片段,因为坦率地说,我无法在这个论坛中弄清楚如何做到这一点——但是!

问题解决方案:使用 HTML FORM 标记的文件上传依赖于特殊的输入类型“文件”。使用它时,会发生各种神奇的事情,包括立即将文件上传到服务器到 /tmp/ 目录中的临时文件。我最初认为是在从客户端上传到服务器的过程中,元数据被剥离了。不是——我能够验证上传的临时文件是否仍然包含元数据。

我的问题是我对临时文件做了什么,将其放入最终文件夹。以任何方式修改文件的任何进程(GD 图像扩展名)都将立即剥离元数据。这符合元数据标准,因为修改后的图像不再是原始图像,并且原始图像的大部分元数据将不再准确!调用 move_uploaded_image() 函数而不事先更改图像,将临时图像完整地复制到其最终目的地。

显然,如果您需要 php 在将图像发送到最终目的地之前对其进行处理,它将不会保留元数据。就我而言,所有此类按摩都是由照片编辑器在上传之前完成的。

标签: php

解决方案


在等待其他人称重时自己弄清楚了。有关详细信息,请参阅我原始帖子的问题解决方案部分。感谢所有看过我问题的人!


推荐阅读