问题描述
我正在为PHP实现一个库实现。
管理员可以访问上传页面,在那里他将上传和分类图像。到目前为止这样好。
实现将允许用户评论管理员上传的图片,所以我正在实现一个数据库表,以链接评论与各自的图像。
id |路径。 id | datetime | comment_title | comment_body | uid
到目前为止这样好。
我希望管理员能够重命名文件(不一定是通过站点,而是通过FTP或其他root访问),而不是破坏整个系统。
我正在考虑实现一个元数据系统来连接ID和图像。这将节省我的第一张桌子,并将允许自由操纵的形象(都在文件夹中移动,重命名等)。
问题是,如何我执行它?如何编写附加到文件的元数据,以及如何读取它? Google没有给出真正的结果。
如果还有更好的方法,我也很乐意听!
感谢您的帮助!
虽然我自己并没有使用sourceforge上的XMP PHP Toolkit听起来就像你可能正在寻找:这是说 - 它是在alpha中,并且在一年内没有更新过。
您也可以使用iptcembed将任意元数据写入图像文件。正如你在评论中提到的,这只适用于JPEG文件。
以下是评论中的脚本一个类将获得并设置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.
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();
这篇关于读取文件的元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!