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

Тема в разделе "Как сделать...", создана пользователем vitrolov, 13 июл 2014.

  1. vitrolov

    vitrolov Постоялец

    Регистр.:
    10 июн 2012
    Сообщения:
    94
    Симпатии:
    77
    Есть небольшой скрипт, который я взял из книги 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:
    Кстати, ссылка на книгу http://rutracker.org/forum/viewtopic.php?t=3283918 очень-очень полезная, для тех, кто изучат РНР. Рекомендую, книга очень отличается от многих изложением материала
     
    Последнее редактирование: 13 июл 2014
  2. ev-goo

    ev-goo Создатель

    Регистр.:
    28 май 2012
    Сообщения:
    10
    Симпатии:
    9
    У вас логика скрипта не верна, не будет он переименовывать. Сначала проверяете картинку на существование, если есть переименовываете, и только затем
    move_uploaded_file. Ну и цикл там вообще не нужен, судя по коду грузится 1 картинка за раз и в этом случае я бы использовал file_exists()
     
  3. vitrolov

    vitrolov Постоялец

    Регистр.:
    10 июн 2012
    Сообщения:
    94
    Симпатии:
    77
    $existing = scandir($destination);
    этим мы открываем папку с картинками получаем название картинок виде массива
    if (in_array($name, $existing))
    Этим мы проверяем загружаемую картинку на существование, если в полученным массиве $existing такое название есть, тогда запускается цикл, который нужен для того, чтобы несколько раз проверить наличие название картинки.
    Например если есть menu.jpg, то запускается цикл и изображение автоматически меняется на menu_1.jpg, если имя занято, тогда еще раз запускается цикл и проверяем наличие menu_2.jpg и так, пока мы не найдем свободное название, скажем menu_10.jpg. Именно для того нужен цикл do {} while(). Еще раз скажу в книге все работает, только в ООП формате.
     
  4. BACZ

    BACZ

    Регистр.:
    18 июн 2008
    Сообщения:
    608
    Симпатии:
    381
    Есть вот такой аплоад, честно сп.... (найденный) из 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">
     
    vitrolov нравится это.