как изменить название картинки при закачки

Mondain

Новичок
PHP:
	$dir_cat = $upload_dir.1;
	$cat = 1;

	if ($open = opendir($dir_cat)) {
		while (false !== ($file = readdir($open))) {
			if ($file != "." && $file != "..") {
				$file = $dir_cat."/".$file;
				echo $file."<br>";
			}
		}
		closedir($open);
	}

	if (file_exists($file) && getimagesize($_FILES['news_image']['tmp_name']) > 1 && is_uploaded_file($_FILES['news_image']['tmp_name'])) {
		$img = $_FILES['news_image']['name'];
		$name = substr($img, 0, strrpos($img, '.'));
		$type = substr($img, strrpos($img, '.'));
		$nameb = substr($name, 0, -1);
		$num = substr($name, -1);

		if (is_numeric($num)) {
			if ($num == $num) {
				$i = $num;
				$i++;
				$rename_img = $nameb.$i.$type;
			}
		} else {
		$rename_img = $name."1".$type;
		}

		if (is_dir($dir_cat)) {
			move_uploaded_file($_FILES['news_image']['tmp_name'], $dir_cat."/".$rename_img);
			$_POST['news_image_url'] = $web_url_image.$cat."/".$rename_img;
			echo "Kartinka&nbsp;<a href=".$web_url_image.$cat."/".$rename_img."><b>".$rename_img."</b></a>&nbsp;uspeshno pereimenovana i dobavlena.";
		} else {
			$oldumask = umask(0);
			mkdir($dir_cat, 0777);
			umask($oldumask);
			move_uploaded_file($_FILES['news_image']['tmp_name'], $dir_cat."/".$rename_img);
			$_POST['news_image_url'] = $web_url_image.$cat."/".$rename_img;
			echo "Kartinka&nbsp;<a href=".$web_url_image.$cat."/".$rename_img."><b>".$rename_img."</b></a>&nbsp;uspeshno pereimenovana i dobavlena.";
		}
	} else if (getimagesize($_FILES['news_image']['tmp_name']) > 1 && is_uploaded_file($_FILES['news_image']['tmp_name'])) {
		if (is_dir($dir_cat)) {
			move_uploaded_file($_FILES['news_image']['tmp_name'], $dir_cat."/".$_FILES['news_image']['name']);
			$_POST['news_image_url'] = $web_url_image.$cat."/".$_FILES['news_image']['name'];
			echo "Kartinka&nbsp;<b><a href=".$web_url_image.$cat."/".$_FILES['news_image']['name']."><b>".$_FILES['news_image']['name']."</b></a>&nbsp;uspeshno dobavlena.";
		} else {
			$oldumask = umask(0);
			mkdir($dir_cat, 0777);
			umask($oldumask);
			move_uploaded_file($_FILES['news_image']['tmp_name'], $dir_cat."/".$_FILES['news_image']['name']);
			$_POST['news_image_url'] = $web_url_image.$cat."/".$_FILES['news_image']['name'];
			echo "Kartinka&nbsp;<b><a href=".$web_url_image.$cat."/".$_FILES['news_image']['name']."><b>".$_FILES['news_image']['name']."</b></a>&nbsp;uspeshno dobavlena.";
		}
	}
Наткнулся на проблему:
в папке 1 есть картинки php.gif и php1.gif

он не создает картинку с названием php2.gif, а пытается перезаписать php.gif. В чем проблема?

PHP:
    $dir_cat = $upload_dir.1;
    $cat = 1;

    if ($open = opendir($dir_cat)) {
        while (false !== ($file = readdir($open))) {
            if ($file != "." && $file != "..") {
                $file = $dir_cat."/".$file;
                echo $file."<br>";
            }
        }
        closedir($open);
    } 

if (file_exists($dir.$file)) {
echo "ok";
} else {
echo "error";
}
Почему эта часть кода не работает?
 

Фанат

oncle terrible
Команда форума
во-первых, опять непонятно - зачем у тебя так много одинакового кода? неужели нельзя один раз написать move_uploaded_file, а не 4?
Ведь тебе надо всего лишь получить ИМЯ ФАЙЛА. Цель всей операции - имя файла.
а в остальном код совершенно одинаковый.

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

Я могу тебе помочь.
Сначала напиши просто код, который из строки pic.jpg делает строку
затем пишешь код, который из pic0 делает pic1
а затем заворачиваешь это дело в цикл, который будет исполняться, пока вновь созданное имя файла не станет уникальным.

На каждом этапе пишешь код сюда и я тебе буду помогать.

Но если это для тебя слишком сложно, то используй просто tempnam, прибавляя его к имени файла, да и все.
 

Mondain

Новичок
PHP:
		$img = 'karta_goroda.jpg';
		$name = substr($img, 0, strrpos($img, '.'));
		$type = substr($img, strrpos($img, '.'));
		$nameb = substr($name, 0, -1);
		$num = substr($name, -1);

		if (is_numeric($num)) {
			if ($num == $num) {
				$i = $num;
				$i++;
				$rename_img = $nameb.$i.$type;
			}
		} else {
			$rename_img = $name."1".$type;
		}

		echo $rename_img;
Разбивает на строку и переименовывает.
 

Фанат

oncle terrible
Команда форума
как-то не очень понятно, что делает код после if (is_numeric($num)) {
почему бы просто не написать
if (is_numeric($num)) $rename_img = $nameb.$num+1.$type;

теперь будем это дело заворачивать в цикл.
делаем цикл, который выполняет этот код до тех пор, пока имя не получится уникальное.
цикл "выполнять до тех пор, пока" у нас называется while
условие, по которому цикл должен выполниться - существование файла. значит, так и пишем!
while(file_exists($img)) {

}
только возвращать код должен не $rename_img, а $img
ведь тебе все равно - переименованное это имя или оригинальное.

создай в папке файлы
karta_goroda.jpg
karta_goroda1.jpg
и karta_goroda2.jpg

и проверь на нем этот код
 

Mondain

Новичок
PHP:
$dir = '/home/steel/www/news/pics/1/';
$img = 'php.gif';

while(file_exists($dir.$img)) {
	$name = substr($img, 0, strrpos($img, '.'));
	$type = substr($img, strrpos($img, '.'));
	$nameb = substr($name, 0, -1);
	$num = substr($name, -1);

	if (is_numeric($num)) {
		$i = $num; $i++;
		$rename_img = $nameb.$num++.$type;
	}
	echo $rename_img;
}
Не могу понять почему не работает?
 

kruglov

Новичок
А когда должен прекратиться цикл while? В терминах "вот такая переменная", "вот такая функция".
 

Фанат

oncle terrible
Команда форума
охохохохох.
возвращать код должен не $rename_img, а $img
у тебя же проверка идет файла с именем $img!
а новое имя ты присваиваешь переменной $rename_img;
ну хотя бы прочитать то что я пишу - можно?
 

Mondain

Новичок
PHP:
$dir = '/home/steel/www/news/pics/1/';
$img = 'php.gif';

while(file_exists($dir.$img)) {
	$name = substr($img, 0, strrpos($img, '.'));
	$type = substr($img, strrpos($img, '.'));
	$nameb = substr($name, 0, -1);
	$num = substr($name, -1);

	if (is_numeric($num) == $num) {
		$i = $num; $i++;
		$rename_img = $nameb.$i.$type;
	} else {
		$rename_img = $name."1".$type;
	}

	echo $img;
	echo "<br>";
	echo $rename_img;

	if ($img != $rename_img) break;
}
Так?
 

Фанат

oncle terrible
Команда форума
мде.

я пишу два раза инструкцию - что делать. не выполняется
Круглов задает вопрос - на него ответа нет.
я сдаюсь.
 

Mondain

Новичок
Извиняйте, не догоняю просто :(

Если название картинки не равняется с измененой картинкой, то прекращаем цикл:
if ($img != $rename_img) break;
 

Фанат

oncle terrible
Команда форума
при чем здесь изменение картинок, если увловие выхода из цикла у тебя совсем другое?!
и оно у тебя УЖЕ ЕСТЬ!
 

Mondain

Новичок
PHP:
$dir = '/home/steel/www/news/pics/1/';
$img = 'php1.gif';

while(file_exists($dir.$img)) {
	$name = substr($img, 0, strrpos($img, '.'));
	$type = substr($img, strrpos($img, '.'));
	$nameb = substr($name, 0, -1);
	$num = substr($name, -1);

	if (is_numeric($num) == $num) {
		$i = $num; $i++;
		echo $rename_img = $nameb.$i.$type;
		break;
	} else {
		echo $rename_img = $name."1".$type;
		break;
	}
}
Так?:)
 

Фанат

oncle terrible
Команда форума
тяжелый случай
цикл "выполнять до тех пор, пока" у нас называется while
условие, по которому цикл должен выполниться - существование файла. значит, так и пишем
скажи, ты вот эти два предложения читал?
а понял?

-~{}~ 18.10.07 15:53:

где у тебя в твоих дурацких break СУЩЕСТВОВАНИЕ ФАЙЛА???

-~{}~ 18.10.07 15:54:

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

kruglov

Новичок
Mondain
Вы хотите поиграть в "я от балды двигаю буквы а вы мне говорите да или нет"?

Вопрос. Последний.

До каких пор вы собираетесь выполнять цикл while? Пока не случится что? Желательно максимально подробно, с упоминанием конкретных переменных.

Думайте.
 

Mondain

Новичок
*****
цикл "выполнять до тех пор, пока" у нас называется while
условие, по которому цикл должен выполниться - существование файла. значит, так и пишем

Не знаю и не понял как это сделать :(

kruglov
До тех пор пока не изменится название картинки которой еще нет в директории.

$img массив который считывает в папке что за картинки есть, их название.
 

Nogrogomed

Новичок
Mondain
во первых:
$img массив который считывает в папке что за картинки есть, их название.
Почему это массив?
во вторых:
а затем заворачиваешь это дело в цикл, который будет исполняться, пока вновь созданное имя файла не станет уникальным.
$i = $num; $i++;
echo $rename_img = $nameb.$i.$type;
break;
Тут вы прервали цикл. А как вы определили что файла pic2.gif не существует? Ответьте - КАК?
 

Mondain

Новичок
Nogrogomed
1:
Я считываю файлы из папки, выдераю их название. Там их три. Чем не массив?

2:
Не знаю как определить :(
иф снова ставить или как?
 
Сверху