读取文件的元数据

Mad*_*iha 4 php filesystems metadata

我正在为PHP制作一个库实现.

管理员可以访问上传页面,在那里他将上传图像并对图像进行分类.到现在为止还挺好.

该实现将允许用户评论管理员已上传的图片,因此我正在实现数据库表以将评论与其各自的图像链接.

id | path .:. id | datetime | comment_title | comment_body | uid
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

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

所以我在考虑实现元数据系统来将ID与图像链接起来.这将节省我的第一个表,并将允许自由处理图像(都在文件夹内移动,重命名等).

问题是,我该如何实现它?如何编写附加到文件的元数据,如何阅读?谷歌没有给出真正的结果.

如果有更好的方法,我也很乐意听到!

将不胜感激任何帮助!

Rap*_*ure 5

虽然我自己没有使用过这个,但是在sourceforge上的XMP PHP工具包听起来就像你可能正在寻找的那样:http://xmpphptoolkit.sourceforge.net/这就是说 - 它是alpha版本,并且在一年多内没有更新它出现.

XMP Toolkit PHP Extension是一个PHP模块,其中包含Adobe XMP Toolkit SDK.这个PHP5扩展将提供类和方法来操作来自jpegs,tiff,png等文件的XMP Metadatas,还有wav,mp3,avi,mpeg4,pdf,ai,eps ......它基于Adobe XMP Toolkit SDK 4.4.2.这个扩展的目标是拥有可以打开文件,提取元数据,操作它们,并将它们放回几行php代码中的php类.该项目受GPL v3许可.

您还可以使用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);
        }
    };


?>
Run Code Online (Sandbox Code Playgroud)

示例读取版权字符串:

$i = new iptc("test.jpg");
echo $i->get(IPTC_COPYRIGHT_STRING); 
Run Code Online (Sandbox Code Playgroud)

更新版权声明:

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