我有以下代码保存图像,但是当它开始保存下一个图像时,它会在已经创建的图像上进行写入。这样做了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" />
答案 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);
并查看您必须处理的实际节点以获取文件名。
最好在屏幕上打印文件名,而不是在排序时创建实际文件。