读取文件的元数据 [英] Reading a File's Metadata

查看:111
本文介绍了读取文件的元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为PHP实现一个库实现。



管理员可以访问上传页面,在那里他将上传和分类图像。到目前为止这样好。



实现将允许用户评论管理员上传的图片,所以我正在实现一个数据库表,以链接评论与各自的图像。

  id |路径。 id | datetime | comment_title | comment_body | uid 

到目前为止这样好。

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



我正在考虑实现一个元数据系统来连接ID和图像。这将节省我的第一张桌子,并将允许自由操纵的形象(都在文件夹中移动,重命名等)。

问题是,如何我执行它?如何编写附加到文件的元数据,以及如何读取它? Google没有给出真正的结果。



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



感谢您的帮助!

解决方案

虽然我自己并没有使用sourceforge上的XMP PHP Toolkit听起来就像你可能正在寻找: http://xmpphptoolkit.sourceforge.net/ 这是说 - 它是在alpha中,并且在一年内没有更新过。


XMP Toolkit PHP Extension是一个PHP模块,它包括Adobe XMP
工具包SDK。这个PHP5扩展将提供类和方法
从jpegs,tiff,png等文件中操作XMP元数据,而且还可以从
wav,mp3,avi,mpeg4,pdf,ai,eps等操作。 XMP
工具包SDK 4.4.2。这个扩展的目标是让php类
可以打开文件,提取元数据,操作它们,并把它们
放回PHP代码的几行内。这个项目是在GPL v3
许可证下。

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



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



以下是评论中的脚本一个类将获得并设置IPTC数据:

 < 

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

IPTC EASY 1.0 - 用于JPEG图像的IPTC数据处理器

所有保留的www .image-host-script.com

2008年9月15日

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

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;


函数iptc($ filename){
$ size = getimagesize($ filename,$ info);
$ this-> hasmeta = isset($ info [APP13]);
if($ this-> hasmeta)
$ this-> meta = iptcparse($ info [APP13]);
$ this-> file = $ filename;

函数集($ tag,$ data){
$ this-> meta [2#$ tag] = Array($ data);
$ this-> hasmeta = true;

函数get($ tag){
return isset($ this-> meta [2#$ tag])? $ this-> meta [2#$ tag] [0]:false;


函数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]);
}
返回$ iptc_new;

函数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 {
返回chr(0x1c).chr($ rec).chr($ dat)。
chr(0x80).chr(0x04)。 $($ len>> 24)& 0xff)。
chr(($ len>> 16)& 0xff)。
chr(($ len>> 8)& 0xff)。
chr(($ len)& 0xff)。
$ val;


$ b函数write(){
if(!function_exists('iptcembed'))return false;
$ mode = 0;
$ content = iptcembed($ this-> binary(),$ this-> file,$ mode);
$ filename = $ this->文件;

@unlink($ filename); #delete if exists

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

#requires安装GD库
函数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,这里是新数据);
$ i-> write();


I am making a gallery implementation for PHP.

The administrator is able to access the upload page, where he would upload and categorize the image. So far so good.

The implementation will allow users to comment on the pictures the admin has uploaded, so I'm implementing a database table to link comments with their respective images.

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

So far so good.

I want the administrator to have the ability to rename files (not necessarily via the site, but via FTP or otherwise root access), and not break the whole system.

So I was thinking of implementing a metadata system to link the ID with the image. That would save me both the first table, and will allow free manipulation of the image (both move it inside folders, rename it, etc).

The question is, how do I implement it? How do I write a metadata attached to a file, and how do I read it? Google gave no real results on this one.

If there's a better way of doing it, I'd love to hear as well!

Will appreciate any help!

解决方案

While I have not used this myself the XMP PHP Toolkit on sourceforge sounds like just what you might be looking for: http://xmpphptoolkit.sourceforge.net/ That being said - it's in alpha and hasn't been updated in over a year it appears.

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.

You are also be able to write arbitrary metadata to an image file with iptcembed. As you mention in your comment this only works for JPEG files.

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

Here is a script from the comments of a class that will get and set IPTC data:

<?

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

        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);
        }
    };


?>

Example read copyright string:

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

Update copyright statement:

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

这篇关于读取文件的元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆