4

I'm trying to make a image upload system to add meta-data to the files themselves.

I'm using the iptcembed from the GD library as shown below:

    <?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);
?>

However when I attach a form and change the $path to the path of the uploaded image and change the iptc array tags to variables form textfields in the data form, it doesn't put add the information.

The image will be uploaded but the tags for author, copyright are not there.

4

1 回答 1

0

如果是权限问题,则包含目录必须可由运行 Web 服务器(大多数情况下为 Apache 或 IIS)的用户写入。

为了确保文件被写入,包含目录必须是任何人都可以写入的。这可能是一个安全问题,但您始终可以撤消您的修改。

如果您对 $path 具有 FTP 访问权限(如我所想),并且可以更改远程目录的权限,请将 $path 目录的权限更改为“世界可写”或0777(八进制数,其中三个 7 分别表示所有者的写权限文件的所有者、所有者的组和其他所有人)。

如果网络服务器在可以执行此操作的用户下运行,您可以通过 PHP 更改目录权限,使用以下指令:

chmod(dirname($path),0777);

dirname()函数返回包含指定路径的目录。

请注意:第二个参数后面的 0,表示 0777 是八进制数;如果你写 777 表示十进制 777,而八进制 777 表示十进制 511)。请查看chmod() 文档以获取有关可能问题的更多信息。

如果你想知道运行网络服务器的用户,你可以使用phpinfo():如果网络服务器是 Apache,你会在“apache2handler”部分找到用户和组,打开“用户/组”。对于 IIS 和其他服务器,您将能够找到(但我不知道确切属于哪个组)。

于 2011-05-10T20:46:32.390 回答