如何保存图像,使其不会覆盖已创建的图像

时间:2011-11-20 10:39:08

标签: php

我有以下代码保存图像,但是当它开始保存下一个图像时,它会在已经创建的图像上进行写入。这样做了10次,最后我留下了一张图片而不是10张单独的图片我该如何解决这个问题呢?

$album_id = $_GET['id'];
$url = 'http://website.com/xml/albums/site/'.$album_id.'/gallery/';
$xml = simplexml_load_file($url);

//album title and url
$album_title = $xml['title'];
$album_url = 'http://website.com'.$xml['html'];

//creates photo album directory
$thisdir = getcwd();
mkdir($thisdir."/".$album_id.' - '.$album_title , 0777);

//obtains all photos and saves them to a directory
foreach($xml as $xml_node) {
    $attributes = $xml_node->attributes();
    $file_url = 'http://website.com'.$attributes['src'];
    $file_name = $attributes['subtitle'];

    //save images
    copy($file_url, $thisdir.'/'.$album_id.' - '.$album_title.'/'.$file_name);

}

XML文件

<photo src="/media/albums/1006969.jpg" title="Red" subtitle="01.jpg" />
<photo src="/media/albums/1006970.jpg" title="Red" subtitle="02.jpg" />
<photo src="/media/albums/100971.jpg" title="Red" subtitle="03.jpg" />
<photo src="/media/albums/1006972.jpg" title="Red" subtitle="04.jpg" />

3 个答案:

答案 0 :(得分:0)

只检查文件是否存在,如果存在,请更改名称。

foreach($xml as $xml_node) {
    $attributes = $xml_node->attributes();
    $file_url = 'http://ebsite.com'.$attributes['src'];
    $file_name = $attributes['subtitle'];

    $path = $thisdir.'/'.$album_id.' - '.$album_title.'/'.$file_name;

    $i = 2;
    while(file_exists($path)) {
        $path = $thisdir.'/'.$album_id.' - '.$album_title.'/' . $i . '-' . $file_name;
        ++$i;
    }

    file_put_contents($path, file_get_contents($file_url));
}

这会产生一些非常难看的命名文件,但希望你能得到这个想法。只是提出某种模式(比如在它前面添加一个整数,如果它存在,从2开始并递增)。然后,将该模式应用于循环中。

答案 1 :(得分:0)

让我觉得你依赖$attributes['subtitle']是独一无二的。相反,也许您需要使用实际的唯一索引,例如XML节点在其父节点中的位置?

答案 2 :(得分:0)

似乎问题与保存文件无关,但很可能您正在以错误的方式处理XML。

首先执行print_r($xml);并查看您必须处理的实际节点以获取文件名。

最好在屏幕上打印文件名,而不是在排序时创建实际文件。