Файлы хранятся на сервере. В PHP они используют строковый тип данных, поддерживают текстовый и бинарный режимы работы с ними. При первом режиме в документе символы – буквы, цифры, знаки, которые есть на клавиатуре. При втором – байты, т.е. двоичная информация. Строки разделяются символом переноса строки. Он разный для UNIX и Windows систем.
Работа с файлами PHP
Есть много готовых функций для работы с файлами. Вот несколько из них.
fopen( $fil , $mode) – открывает документ $fil. Параметр $mode если содержит a, то документ, если его нет, создастся и откроется для записи и чтения. Если еще добавлен t, то документ текстовый с символом перевода строки.
fwrite($fl, $str) - записывает в файл $fl строку $str.
fclose($fl) – закрывает $fl.
file – прочитает содержимое документа.
Задача с файлами
Изготовить форму с полями "Имя", "Комментарий".
Обработать форму, записать введенные данные в файл.
На той же странице с формой вывести все комментарии в таблице. На одной строке имя и комментарий.
Примечание: Требуется обдумать, как разделить отдельные комментарии, в каком состоянии сохранить их в документ. Чтобы этот файл затем обработать, вывести на страницу браузера.
В этом разделе расскажу, как написал скрипты 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);
}
?>
Проверить работу галереи фотографий в новом окне. Чистый функционал программ без стилей и дизайна.