2012-01-14 2 views
4

Я делаю реализацию галереи для PHP.Чтение метаданных файла

Администратор может получить доступ к странице загрузки, где он будет загружать и классифицировать изображение. Все идет нормально.

Реализация позволит пользователям прокомментировать фотографии, загруженные администратором, поэтому я реализую таблицу базы данных, чтобы связывать комментарии с их соответствующими изображениями.

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

Пока все хорошо.

Я хочу, чтобы администратор имел возможность переименовывать файлы (не обязательно через сайт, а через FTP или в противном случае root-доступ), а не нарушать всю систему.

Так что я думал о внедрении системы метаданных для связывания идентификатора с изображением. Это спасло бы меня и от первой таблицы, и позволит свободно манипулировать изображением (как перемещать его внутри папок, так и переименовывать, и т. Д.).

Вопрос в том, как его реализовать? Как написать метаданные, прикрепленные к файлу, и как их прочитать? Google не дал реальных результатов на этом.

Если есть лучший способ сделать это, я тоже хотел бы услышать!

Поймите любую помощь!

ответ

5

В то время как я сам не использовал это, 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); 

Update:

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

Похоже, только он старый. В любом случае, я вижу в примерах, что это только для файлов 'jpg', но так как это галерея, то больше типов изображений должно быть разрешено, возможно,' gif', 'png'. Есть предложения? –

+0

Я отредактировал свой комментарий, чтобы включить информацию, которую я нашел в XMP PHP Toolkit. Звучит намного более надежно в том, что он поддерживает. – Rapture

+1

Я видел ваше редактирование (позор, который я не могу выдвинуть дважды) Я попробую и вернусь. Если я увижу, что это работает по назначению, я приму этот ответ! Большое спасибо :) –

Смежные вопросы