提问人:Madara's Ghost 提问时间:1/14/2012 更新时间:4/6/2013 访问量:7212
读取文件的元数据
Reading a File's Metadata
问:
我正在为 PHP 制作一个图库实现。
管理员能够访问上传页面,在该页面中,他将上传图像并对其进行分类。目前为止,一切都好。
该实现将允许用户对管理员上传的图片发表评论,因此我正在实现一个数据库表,以将评论与他们各自的图像联系起来。
id | path .:. id | datetime | comment_title | comment_body | uid
目前为止,一切都好。
我希望管理员能够重命名文件(不一定通过站点,而是通过FTP或其他root访问权限),并且不会破坏整个系统。
因此,我正在考虑实现一个元数据系统来将 ID 与图像联系起来。这将为我节省第一个表,并允许自由操作图像(将其移动到文件夹内,重命名等)。
问题是,我该如何实现它?如何编写附加到文件的元数据,以及如何读取它?谷歌对此没有给出任何实际结果。
如果有更好的方法,我也想听听!
将不胜感激任何帮助!
答:
虽然我自己没有使用过它,但 sourceforge 上的 XMP PHP 工具包听起来就像您可能正在寻找的: http://xmpphptoolkit.sourceforge.net/ 话虽如此 - 它处于 alpha 阶段,并且一年多来没有更新。
XMP Toolkit PHP Extension 是一个 PHP 模块,其中包括 Adobe XMP 工具包 SDK。这个 PHP5 扩展将提供类和方法 从 jpeg、tiff、png 等文件中操作 XMP 元数据,还可以 WAV、MP3、AVI、MPEG4、PDF、AI、EPS......它基于 Adobe XMP 工具包 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);
}
};
?>
读取版权字符串示例:
$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();
评论
jpg
gif
png
评论