我正在为 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/