Запись exif и itpc данных в PHP - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь создать систему загрузки изображений для добавления метаданных к самим файлам.

Я использую iptcembed из библиотеки GD, как показано ниже:

    <?php

// iptc_make_tag() function by Thies C. Arntzen
function iptc_make_tag($rec, $data, $value)
{
    $length = strlen($value);
    $retval = chr(0x1C) . chr($rec) . chr($data);

    if($length < 0x8000)
    {
        $retval .= chr($length >> 8) .  chr($length & 0xFF);
    }
    else
    {
        $retval .= chr(0x80) . 
                   chr(0x04) . 
                   chr(($length >> 24) & 0xFF) . 
                   chr(($length >> 16) & 0xFF) . 
                   chr(($length >> 8) & 0xFF) . 
                   chr($length & 0xFF);
    }

    return $retval . $value;
}

// Path to jpeg file
$path = './phplogo.jpg';

// We need to check if theres any IPTC data in the jpeg image. If there is then 
// bail out because we cannot embed any image that already has some IPTC data!
$image = getimagesize($path, $info);

if(isset($info['APP13']))
{
    die('Error: IPTC data found in source image, cannot continue');
}

// Set the IPTC tags
$iptc = array(
    '2#120' => 'Test image',
    '2#116' => 'Copyright 2008-2009, The PHP Group'
);

// Convert the IPTC tags into binary code
$data = '';

foreach($iptc as $tag => $string)
{
    $tag = substr($tag, 2);
    $data .= iptc_make_tag(2, $tag, $string);
}

// Embed the IPTC data
$content = iptcembed($data, $path);

// Write the new image data out to the file.
$fp = fopen($path, "wb");
fwrite($fp, $content);
fclose($fp);
?>

Однако, когда я присоединяю форму и изменяю $path на путь загруженного изображения и меняю теги массива iptc на переменные из текстовых полей формы в форме данных, это не добавляет добавления информации.

Изображение будет загружено, но теги для автора, авторские права отсутствуют.

1 Ответ

0 голосов
/ 11 мая 2011

Если это проблема с правами доступа, содержащий каталог должен быть доступен для записи пользователю, под которым работает веб-сервер (в большинстве случаев Apache или IIS).

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

Если у вас есть FTP-доступ к $ path (как я полагаю) и вы можете изменить разрешения удаленных каталогов, измените разрешения каталога $ pathна «доступный для записи» или 0777 (восьмеричное число, где три 7 означают соответственно право на запись для владельца файла, группы владельца и всех остальных).

Если веб-сервер работает под пользователем, которыйсделать это, вы можете изменить права доступа к каталогу через PHP, с помощью инструкции:

chmod(dirname($path),0777);

Функция dirname() возвращает каталог, содержащий указанный путь.

Обратите внимание: завершающий 0во втором аргументе, что означает, что 0777 является восьмеричным числом;если вы пишете 777, это означает десятичное число 777, а восьмеричное 777 - это десятичное число 511).Пожалуйста, ознакомьтесь с документацией chmod () , чтобы получить дополнительную информацию о возможных проблемах.

Если вы хотите узнать пользователя, под которым работает веб-сервер, вы можете использовать phpinfo () : если веб-сервер Apache, вы найдете пользователя и группу в разделе «apache2handler», а не «пользователя / группы».Для IIS и других серверов вы сможете узнать (но я не знаю точно, в какой группе).

...