Я делаю реализацию галереи для PHP.
Администратор может получить доступ к странице загрузки, где он будет загружать и классифицировать изображение. Все идет нормально.
Реализация позволит пользователям комментировать снимки, загруженные администратором, поэтому я реализую таблицу базы данных, чтобы связывать комментарии с их соответствующими изображениями.
id | path .:. id | datetime | comment_title | comment_body | uid
Все идет нормально.
Я хочу, чтобы администратор имел возможность переименовывать файлы (не обязательно через сайт, а через FTP или иначе root-доступ), а не прерывать всю систему.
Поэтому я думал о внедрении системы метаданных для связывания идентификатора с изображением. Это спасло бы меня и от первой таблицы, и позволит свободно манипулировать изображением (как перемещать его внутри папок, так и переименовывать, и т. Д.).
Вопрос в том, как мне его реализовать? Как написать метаданные, прикрепленные к файлу, и как их прочитать? Google не дал реальных результатов на этом.
Если есть лучший способ сделать это, я тоже хотел бы услышать!
Поблагодарите любую помощь!
Хотя я сам не использовал это, XMP PHP Toolkit на sourceforge звучит как раз то, что вы можете искать: http://xmpphptoolkit.sourceforge.net/ Это, как говорится, это альфа и не обновлялось более года кажется.
XMP Toolkit PHP Extension – это PHP-модуль, который включает в себя Adobe XMP Toolkit SDK. Это расширение PHP5 предоставит классы и методы для управления метаданными XMP из таких файлов, как jpegs, tiff, png, но также 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); } }; ?>
Пример: прочитайте строку авторского права:
$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();