ВСЕ СТАТЬИ
Блог начинающего программиста
Кнопка войти через Яндекс
Регистрация
Программирование на JavaScript для начинающих 2.0

Самый востребованный язык программирования

Какой язык программирования должен знать абсолютно любой программист?

Узнай прямо сейчас!

Галерея фотографий в файлах 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 для фотогалереи без базы данных. Упражнение выполнено в учебных целях по заданию Д. Ляпина А. Никитина.

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


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

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

  • При загрузке фото на сервер проверка типа файла, автоматическое создание уменьшенной копии (не более 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><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);
}
?>
        

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


Кипящий чайник с выхлопом клубов пара из носика

Интенсив «Основы программирования»

Бесплатный курс по программированию

Начать обучение

Бесплатный курс по основам PHP

Бесплатный Видеокурс по PHP!

Пример создания PHP-сайта!

Подробнее

Комментарии

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

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

Кнопка войти через Яндекс Зарегистрироваться
Имя:
Электронная почта:
Текст комментария:
Введите код с картинки:
картинка
PHP хостинг ХостиЯ