php - 读取文件的元数据

标签 php filesystems metadata

我正在为 PHP 实现画廊。

管理员可以访问上传页面,他可以在该页面上传图片并对其进行分类。到目前为止一切顺利。

该实现将允许用户对管理员上传的图片发表评论,因此我正在实现一个数据库表以将评论与其各自的图片链接起来。

id | path .:. id | datetime | comment_title | comment_body | uid

到目前为止一切顺利。

我希望管理员能够重命名文件(不一定通过站点,而是通过 FTP 或其他根访问权限),而不破坏整个系统。

所以我在考虑实现一个元数据系统来将 ID 与图像联系起来。这将为我节省第一个表格,并允许自由操作图像(将其移动到文件夹内、重命名等)。

问题是,我该如何实现它?如何写入附加到文件的元数据,以及如何读取它?谷歌在这方面没有给出真正的结果。

如果有更好的方法,我也很想听听!

将不胜感激!

最佳答案

虽然我自己没有使用过它,但 sourceforge 上的 XMP PHP 工具包听起来正是您正在寻找的东西:http://xmpphptoolkit.sourceforge.net/话虽这么说 - 它处于 alpha 阶段,并且已经超过一年没有更新了。

XMP Toolkit PHP Extension is a PHP module which includes the Adobe XMP Toolkit SDK. This PHP5 extension will provide classes and methods to manipulate XMP Metadatas from files like jpegs, tiff, png, but also wav, mp3, avi, mpeg4, pdf, ai, eps… It’s based from the Adobe XMP Toolkit SDK 4.4.2. The goal of this extension is to have php classes which can open files, extract metadatas, manipulate them, and put them back within few lines of php code. This project is under GPL v3 License.

您还可以使用 iptcembed 将任意元数据写入图像文件。正如您在评论中提到的,这仅适用于 JPEG 文件。

http://php.net/manual/en/function.iptcembed.php

这是一个来自类注释的脚本,它将获取和设置 IPTC 数据:

<?

    /************************************************************\

        IPTC EASY 1.0 - IPTC data manipulator for JPEG images

        All reserved www.image-host-script.com

        Sep 15, 2008

    \************************************************************/

    DEFINE('IPTC_OBJECT_NAME', '005');
    DEFINE('IPTC_EDIT_STATUS', '007');
    DEFINE('IPTC_PRIORITY', '010');
    DEFINE('IPTC_CATEGORY', '015');
    DEFINE('IPTC_SUPPLEMENTAL_CATEGORY', '020');
    DEFINE('IPTC_FIXTURE_IDENTIFIER', '022');
    DEFINE('IPTC_KEYWORDS', '025');
    DEFINE('IPTC_RELEASE_DATE', '030');
    DEFINE('IPTC_RELEASE_TIME', '035');
    DEFINE('IPTC_SPECIAL_INSTRUCTIONS', '040');
    DEFINE('IPTC_REFERENCE_SERVICE', '045');
    DEFINE('IPTC_REFERENCE_DATE', '047');
    DEFINE('IPTC_REFERENCE_NUMBER', '050');
    DEFINE('IPTC_CREATED_DATE', '055');
    DEFINE('IPTC_CREATED_TIME', '060');
    DEFINE('IPTC_ORIGINATING_PROGRAM', '065');
    DEFINE('IPTC_PROGRAM_VERSION', '070');
    DEFINE('IPTC_OBJECT_CYCLE', '075');
    DEFINE('IPTC_BYLINE', '080');
    DEFINE('IPTC_BYLINE_TITLE', '085');
    DEFINE('IPTC_CITY', '090');
    DEFINE('IPTC_PROVINCE_STATE', '095');
    DEFINE('IPTC_COUNTRY_CODE', '100');
    DEFINE('IPTC_COUNTRY', '101');
    DEFINE('IPTC_ORIGINAL_TRANSMISSION_REFERENCE',     '103');
    DEFINE('IPTC_HEADLINE', '105');
    DEFINE('IPTC_CREDIT', '110');
    DEFINE('IPTC_SOURCE', '115');
    DEFINE('IPTC_COPYRIGHT_STRING', '116');
    DEFINE('IPTC_CAPTION', '120');
    DEFINE('IPTC_LOCAL_CAPTION', '121');

    class iptc {
        var $meta=Array();
        var $hasmeta=false;
        var $file=false;


        function iptc($filename) {
            $size = getimagesize($filename,$info);
            $this->hasmeta = isset($info["APP13"]);
            if($this->hasmeta)
                $this->meta = iptcparse ($info["APP13"]);
            $this->file = $filename;
        }
        function set($tag, $data) {
            $this->meta ["2#$tag"]= Array( $data );
            $this->hasmeta=true;
        }
        function get($tag) {
            return isset($this->meta["2#$tag"]) ? $this->meta["2#$tag"][0] : false;
        }

        function dump() {
            print_r($this->meta);
        }
        function binary() {
            $iptc_new = '';
            foreach (array_keys($this->meta) as $s) {
                $tag = str_replace("2#", "", $s);
                $iptc_new .= $this->iptc_maketag(2, $tag, $this->meta[$s][0]);
            }        
            return $iptc_new;    
        }
        function iptc_maketag($rec,$dat,$val) {
            $len = strlen($val);
            if ($len < 0x8000) {
                   return chr(0x1c).chr($rec).chr($dat).
                   chr($len >> 8).
                   chr($len & 0xff).
                   $val;
            } else {
                   return chr(0x1c).chr($rec).chr($dat).
                   chr(0x80).chr(0x04).
                   chr(($len >> 24) & 0xff).
                   chr(($len >> 16) & 0xff).
                   chr(($len >> 8 ) & 0xff).
                   chr(($len ) & 0xff).
                   $val;

            }
        }    
        function write() {
            if(!function_exists('iptcembed')) return false;
            $mode = 0;
            $content = iptcembed($this->binary(), $this->file, $mode);    
            $filename = $this->file;

            @unlink($filename); #delete if exists

            $fp = fopen($filename, "w");
            fwrite($fp, $content);
            fclose($fp);
        }    

        #requires GD library installed
        function removeAllTags() {
            $this->hasmeta=false;
            $this->meta=Array();
            $img = imagecreatefromstring(implode(file($this->file)));
            @unlink($this->file); #delete if exists
            imagejpeg($img,$this->file,100);
        }
    };


?>

示例读取版权字符串:

$i = new iptc("test.jpg");
echo $i->get(IPTC_COPYRIGHT_STRING); 

更新版权声明:

$i = new iptc("test.jpg");
echo $i->set(IPTC_COPYRIGHT_STRING,"Here goes the new data"); 
$i->write();

关于php - 读取文件的元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8862645/

相关文章:

c++ - 挂载文件系统和挂载磁盘驱动器有什么区别

angular - 如何获取 Angular 2 中当前模块的元数据?

php - 将字符串参数传递给 WP REST API

php - 与 safari 和 firefox 相比,chrome 对 session /cookie 的处理有何不同

matlab - 调用MATLAB的dir函数后如何过滤隐藏文件

linux - 限制符号链接(symbolic link)删除

android - 更改用户评论 EXIF 标签 (0x9286)

metadata - 无法使用 OpenStack Swift 对象设置多个元数据

php - 在 PHP 中执行 shell 脚本

php - 使用 PHP 获取目录中所有文件的名称