Изменить название картинки при загрузке на сервер

vitrolov

Постоялец
Регистрация
10 Июн 2012
Сообщения
132
Реакции
131
Есть небольшой скрипт, который я взял из книги David Powers php solutions dynamic web design . Скрипт меняет название картинки ,если такое название уже есть, например, мы загружаем картинку с названием menu.jpg, если такая есть, то изображение автоматически меняется на menu_1.jpg, или на menu_2.jpg, думаю, суть понятна.
Дело в том, что там используется ООП, я переделал скрипт для себя, изображение он загружает, но название картинок остается прежним. Не могу понять в чем проблема. Надеюсь, что кто-то объяснит мне в чем моя ошибка
Да, и еще я только начал изучать РНР, не надо зразу обзываться :smmne:Проверку размеров, и типов загружаемых файлов занимается другой скрипт, это я так, на всяк случай написал.

Код:
<?php
if (isset($_POST['submit']))
{
    $destination = 'image/';
    $name = $_FILES['image']['name'];
    if (move_uploaded_file($_FILES['image']['tmp_name'], $destination . $name ))
    {
        // Проверяем есть ли такое название
        $existing = scandir($destination);
        //  Если есть запускаем этот блок
        if (in_array($name, $existing))
        {
            // Получаем название изображение без формата
            $dot = strrpos($name, '.');
            $base = substr($name, 0, $dot);
            $extension = substr($name, $dot);
            $i = 1;
            // Эта часть должна переименовать картинку!!
            do
            {
                $name = $base . '_' . $i++ . $extension;
            }
            while (in_array($name, $existing));
            echo "File successfully uploaded!";
        }
    }
    else
    {
        echo "Error! Please, try again later";
    }
}

?>
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<form action="" method="POST" enctype="multipart/form-data">
    <label for="image">Upload image: </label>
    <input type="file" name="image" id="image" /><br />
    <input type="submit" name="submit" value="Upload image" />
</form>
</body>
</html>
И еще одно, можно ли использовать функцию file_exists() вместо in_array(). Одним словом, буду рад любым вашим замечаниям :beer:
Кстати, ссылка на книгу Для просмотра ссылки Войди или Зарегистрируйся очень-очень полезная, для тех, кто изучат РНР. Рекомендую, книга очень отличается от многих изложением материала
 
Последнее редактирование:
У вас логика скрипта не верна, не будет он переименовывать. Сначала проверяете картинку на существование, если есть переименовываете, и только затем
move_uploaded_file. Ну и цикл там вообще не нужен, судя по коду грузится 1 картинка за раз и в этом случае я бы использовал file_exists()
 
$existing = scandir($destination);
этим мы открываем папку с картинками получаем название картинок виде массива
if (in_array($name, $existing))
Этим мы проверяем загружаемую картинку на существование, если в полученным массиве $existing такое название есть, тогда запускается цикл, который нужен для того, чтобы несколько раз проверить наличие название картинки.
Например если есть menu.jpg, то запускается цикл и изображение автоматически меняется на menu_1.jpg, если имя занято, тогда еще раз запускается цикл и проверяем наличие menu_2.jpg и так, пока мы не найдем свободное название, скажем menu_10.jpg. Именно для того нужен цикл do {} while(). Еще раз скажу в книге все работает, только в ООП формате.
 
Есть вот такой аплоад, честно сп.... (найденный) из fckeditor-а
Код:
 if (!isset($_FILES)) {  global $_FILES; }
 $sFileName = '' ;
 if ( isset( $_FILES['tmpFile'] ) && !is_null( $_FILES['tmpFile']['tmp_name'] ) )
 {
 $oFile = $_FILES['tmpFile'] ;
 // Map the virtual path to the local server path.
 $mydir=pathinfo($_SERVER['SCRIPT_FILENAME']);
 $mydirname=$mydir['dirname'];
 $dir=getcwd();
 if(!($mydirname===$dir)) $dir=$mydirname;
 $sServerDir = $dir."/";
 // Get the uploaded file name.
 $sFileName = $oFile['name'] ;
 $sOriginalFileName = $sFileName ;
 $sExtension = substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ;
 $iCounter = 0 ;

 while ( true )
 {
 $sFilePath = $sServerDir . $sFileName ;
 if ( is_file( $sFilePath ) )
 {
 $iCounter++ ;
 $sFileName =  $sOriginalFileName  . '(' . $iCounter . ').' . $sExtension ;
 echo "File ".$sFilePath." already exists. Changing name to ".$sFileName."<br>";
 }
 else
 {
 move_uploaded_file( $oFile['tmp_name'], $sFilePath ) ;
 if ( is_file( $sFilePath ) ) 
  echo "<br> File ".$oFile['tmp_name'] ."moved to ".$sFilePath." successfully!<br>";
 break ;
 }
 }
 if ( file_exists( $sFilePath ) )  echo "<br>Done!" ;

  }
?>
Файл берется из вот такой строки
<input id="tmpFile" name="tmpFile" style="style="WIDTH: 100%" type="file">
 
Назад
Сверху