ВСЕ СТАТЬИ
Блог начинающего программиста
Регистрация

Галерея фотографий в файлах PHP

Опубликовано:

Файлы хранятся на сервере. В PHP они используют строковый тип данных, поддерживают текстовый и бинарный режимы работы с ними. При первом режиме в документе символы – буквы, цифры, знаки, которые есть на клавиатуре. При втором – байты, т.е. двоичная информация. Строки разделяются символом переноса строки. Он разный для UNIX и Windows систем.

Работа с файлами PHP

Есть много готовых функций для работы с файлами. Вот несколько из них.

fopen( $fil , $mode) – открывает документ $fil. Параметр $mode если содержит a, то документ, если его нет, создастся и откроется для записи и чтения. Если еще добавлен t, то документ текстовый с символом перевода строки.

fwrite($fl, $str) - записывает в файл $fl строку $str.

fclose($fl) – закрывает $fl.

file – прочитает содержимое документа.

Задача с файлами

  1. Изготовить форму с полями "Имя", "Комментарий".
  2. Обработать форму, записать введенные данные в файл.
  3. На той же странице с формой вывести все комментарии в таблице. На одной строке имя и комментарий.

Примечание: Требуется обдумать, как разделить отдельные комментарии, в каком состоянии сохранить их в документ. Чтобы этот файл затем обработать, вывести на страницу браузера.

Результат работы

Программа com.php.


<?php
$fil = fopen ("com.txt", "a+t");
if (isset ($_POST['name']) && isset ($_POST['comment']))
{
    $name = htmlspecialchars($_POST['name']);
    $comment = htmlspecialchars($_POST['comment']);
    fwrite ($fil, $name . "\n");
    fwrite ($fil, $comment . "\n");
}
fclose ($fil);
$lines = file ('com.txt');
?>
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="На странице браузера форма для написания комментария и вывод всех комментарий">
    <meta name="keywords" content="имя, комментарий">
    <title> Работа с файлами</title>
</head>
<body>
<h1>Файл на сервере</h1>
<table border="1">
    <tr>
        <td>Имя</td>
        <td>Комментарий</td>
    </tr>
    <tr>
        <?php
            if (isset ($_POST['name']) && isset ($_POST['comment']))
            {
                $n = count ($lines);
                for ($i = 0; $i < $n; $i +=2)
                {
                    echo '<tr>';
                    echo '<td>' . $lines[$i + 0] . '</td>';
                    echo '<td>' . $lines[$i + 1] . '</td>';
                    echo '</tr>';
                }
            }
        ?>
    </tr>
</table>
<form method="post">
    Имя:
    <input type="text" name="name">
    Комментарий:
        <textarea name="comment">
        </textarea>
    <input type="submit">
</form>
</body>
</html>

Работа этой программы создает на сервере файл com.txt в той же директории (каталоге), что и com.php. В него будут записываться “Имя", "Комментарий".

Посмотрите результат, проверьте работу с файлами на отдельной вкладке браузера.

Фотогалерея на скриптах PHP

Дополнено 2017.09.27

Задание урока 9 из книги Д. Ляпина А. Никитина "PHP - это просто"

В этом разделе расскажу, как написал скрипты PHP для фотогалереи без базы данных. Упражнение выполнено в учебных целях по заданию Д. Ляпина А. Никитина.

Изготовить галерею фотографий


Фотографии природы Карелии и фотоаппарата Зенит-Е в фотоальбоме

Рис. Галерея фотографий о Карелии и фотоаппарата Зенит-Е в фотоальбоме

Возможности:

  • При загрузке фото на сервер проверка типа файла, автоматическое создание уменьшенной копии (не более 200 пикселей на наибольшей стороне).
  • Просмотр всех уменьшенных фото на одной странице.
  • При щелчке по маленькой фотографии - переход на другую страницу с крупной фотографией.

Подсказки:

  • Создать два каталога - для больших и маленьких фото.
  • Механизм обхода каталога - для получения списка фотографий.

Решение в скриптах

Создадим 2 каталога:

  • img_big - для больших изображений
  • img_small - для уменьшенных изображений

Создадим 3 файла:

  • index.php - главная страница нашего сайта галереи фотографий с выводом загруженных фото и с формой для загрузки фото на сервер;
  • function.php - библиотека функций сайта;
  • upload.php - файл-обработчик загрузки файлов, уменьшения изображения, вывода информации о результатах загрузки.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Галерея фото</title>
    </head>
    <body>
        <h1>Галерея фотографий</h1>
        <?php
        require_once ('function.php');
        //вывод изображений
        $dir = "img_small"; // Путь к директории, в которой лежат малые изображения
        $dir_big = "img_big"; // Путь к директории, в которой лежат большые изображения
        $files = scandir($dir); // Получаем список файлов из этой директории
        $files = excess($files); // Удаляем лишние файлы c '.' ...
        /* Дальше происходит вывод изображений на страницу сайта */
        for ($i = 0; $i < count($files); $i++)
        {
        ?>
        <!-- Делаем ссылку на большую картинку, вывод малых картинок -->
            <a href="<?=$dir_big . "/" . $files[$i]?>" target="_blank"><img src="<?=$dir."/".$files[$i]?>" alt="Фото галереи" /></a>
        <?php
        }
        ?>
        <h2>Загрузить фотографию</h2>
        <form action="upload.php" method="post" enctype="multipart/form-data">
            <p><input type="file" name="file"></p>
            <p itemprop="codeSampleType"><input type="submit" name="load" value="Загрузить файл"></p>
            <br>
        </form>
    </body>
</html>
        

<?php
/**
 * Функция загрузки файла (аплоадер)
 * @param  int    $max_file_size    максимальный размер файла в мегабайтах
 * @param  array  $valid_extensions массив допустимых расширений
 * @param  string $upload_dir       директория загрузки
 * @return array                    сообщение о ходе выполнения
 */
/* В php скрипте реализованы две проверки:
так как хостер ограничивает размер загружаемого файла (на момент написания данного материала у меня на хостинге стоит ограничение в 8 Mb), то проверка максимального размера необходима;
проверка расширения файла позволяет отсеять ненужные файлы до загрузки.
URL фотографии - $destination.  return $destination  А далее вставляете URL фото куда вам надо */
function upload($max_file_size, $valid_extensions, $upload_dir)
{
    setlocale(LC_ALL, 'ru_RU . UTF8');
    $error = null;
    $info  = null;
    $max_file_size *= 1048576;  // перевод размера файла в b
    if ($_FILES['file']['error'] === UPLOAD_ERR_OK)
    {
        // проверяем расширение файла
        $file_extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
        if (in_array(strtolower($file_extension), $valid_extensions))
        {
            // проверяем размер файла
            if ($_FILES['file']['size'] < $max_file_size)
            {
                $file_name = time() . $_FILES['file']['name'];  // к имени файла добавляем метку времени, чтобы исключить одинаковые имена
                $destination = $upload_dir .'/' . $file_name;

                if (move_uploaded_file($_FILES['file']['tmp_name'], $destination))//Перемещает загруженный файл в новое место.
                    $info = 'Файл успешно загружен';
                else
                    $error = 'Не удалось загрузить файл';
            }
            else
                $error = 'Размер файла больше допустимого';
        }
        else
            $error = 'У файла недопустимое расширение';
    }
    else
    {    
        // массив ошибок
        $error_values = [

            UPLOAD_ERR_INI_SIZE   => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',
            UPLOAD_ERR_FORM_SIZE  => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',
            UPLOAD_ERR_PARTIAL    => 'Файл был загружен только частично',
            UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',
            UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',
            UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск'

        ];
         
        $error_code = $_FILES['file']['error'];

        if (!empty($error_values[$error_code]))
            $error = $error_values[$error_code];
        else
            $error = 'Случилось что-то непонятное';
    }

    return ['info' => $info, 'error' => $error, 'destination'=>$destination];
}

/*
Функция img_resize(): генерация thumbnails
Параметры:
$src             - имя исходного файла
$dest            - имя генерируемого файла
$width, $height  - ширина и высота генерируемого изображения, в пикселях
Необязательные параметры:
$rgb             - цвет фона, по умолчанию - белый
$quality         - качество генерируемого JPEG, по умолчанию - максимальное (100)
*/

function img_resize($src, $dest, $width, $height, $rgb = 0xFFFFFF, $quality = 100)
{
    if (!file_exists($src)) // Проверить наличие указанного файла или каталога.
        return false;
    $size = getimagesize($src);

    if ($size === false)
        return false;
    $format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
    $icfunc = 'imagecreatefrom' . $format;

    if (!function_exists($icfunc))
        return false;

    $x_ratio = $width  / $size[0];
    $y_ratio = $height / $size[1];

    if ($height == 0)
    {
        $y_ratio = $x_ratio;
        $height  = $y_ratio * $size[1];
    }
    elseif ($width == 0)
    {
        $x_ratio = $y_ratio;
        $width   = $x_ratio * $size[0];
    }

    $ratio       = min($x_ratio, $y_ratio);
    $use_x_ratio = ($x_ratio == $ratio);

    $new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
    $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
    $new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width)   / 2);
    $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

    // если не нужно увеличивать маленькую картинку до указанного размера
    if ($size[0]<$new_width && $size[1]<$new_height)
    {
        $width = $new_width = $size[0];
        $height = $new_height = $size[1];
    }

    $isrc  = $icfunc($src);
    $idest = imagecreatetruecolor($width, $height);

    imagefill($idest, 0, 0, $rgb);
    imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);

    $i = strrpos($dest,'.');
    if (!$i) return '';
    $l = strlen($dest) - $i;
    $ext = substr($dest,$i+1,$l);

    switch ($ext)
    {
        case 'jpeg':
        case 'jpg':
            imagejpeg($idest,$dest,$quality);
            break;
        case 'gif':
            imagegif($idest,$dest);
            break;
        case 'png':
            imagepng($idest,$dest);
            break;
    }

    imagedestroy($isrc);
    imagedestroy($idest);

    return true;
}
/* Функция для удаления лишних файлов: Текущий каталог и родительский пропускаем, не выводим файлы Thumbs.db */ 
function excess($files)
{
    $result = [];
    for ($i = 0; $i < count($files); $i++)
    {
        if ($files[$i] != "." && $files[$i] != ".."  && $files[$i] != "Thumbs.db")
            $result[] = $files[$i];
    }
    return $result;
}
?>
        

  <?php
/*файл–обработчик формы загрузки пользовательского файла.*/
include("function.php"); // подключаем файл с функциями
// Запускаем функцию загрузки
if(!empty($_POST['load'])) // если кнопка "Загрузить файл"  нажата
{
    $valid_extensions = ['jpg', 'jpeg', 'png', 'gif'];
    $upload_dir = 'img_big';  // папка для загрузки (создать на сервере)
    $message = upload(1, $valid_extensions, $upload_dir);
    // Выводим сообщение
    echo $message['error'] ? $message['error'] : $message['info'];
    // Если загрузка файла на сервер успешная
    if(isset($_FILES["file"]))//Определяет, была ли установлена переменная значением отличным от NULL
    {
        ini_set('max_file_uploads', '3'); /*Установить максимальное количество загружаемых на сервер файлов за один раз*/
        $file = $_FILES["file"]["tmp_name"];
        $myfile_name = $_FILES["file"]["name"];
        $file_type = substr($myfile_name, strrpos($myfile_name, '.')+1); //strrpos - Возвращает позицию последнего вхождения символа
        $file_size = $_FILES["file"]["size"];
        $error_flag = $_FILES["file"]["error"];

        // Если ошибок не было
        if($error_flag == 0)
        {
            $f_thum="big/thum_" . $myfile_name;

            print("<br>" . "Имя файла на нашем сервере (во время запроса): " . $file . "<br>");
            print("Имя файла на компьютере пользователя: " . $myfile_name . "<br>");
            print("Имя thumb-файла на сервере: " . $f_thum . "<br>");
            print("MIME-тип файла: " . $file_type . "<br>");
            print("Размер файла: " . $file_size . "<br><br>");
        }
    }
    echo '<br /><br />';
    echo '<a href="index.php">Вернуться на страницу галереи</a>';
    $src = $message['destination'];

/* чтобы изменить размеры фото необходимо запустить функцию img_resize с нужными параметрами ширины и высоты нового изображения. Если нужен только один параметр, например ширина 200px, то высоту задаем равную 0 (ноль). При этом получим пропорциональное фото с шириной 200px.*/

$file_name = time() . $_FILES['file']['name'];
$dest = 'img_small/' . $file_name;

img_resize($src, $dest, 200, 0);
}
?>
        

Проверить работу галереи фотографий в новом окне. Чистый функционал программ без стилей и дизайна.


Комментарии

Пока комментарий нет

Оставить свой комментарий:

Зарегистрироваться
Имя:
Электронная почта:
Текст комментария:
Введите код с картинки:
картинка