Работа с изображения в РНР

Често ни се налага да манипулираме с файлове от специфична директория. Ако сме с Apache сървър, можем да преработим .htaccess файла, да укажем на браузъра къде се намира директорията, съдържаща файловете и да видим списък с нейното съдържание. Ако целта ни е просто да разгледаме списък с изображенията, намиращи се в тази директория, това е достатъчно. Ако обаче искаме да контролираме реда, в който се показват изображенията и файлове с какви разширения да се показват, преработването на .htaccess файла на сървъра не е достатъчно.
Да си предсавим, че искаме да почистим директорията images от ненужните файлове. Как ще направим това с РНР?

Дефинираме клас и декларираме свойствата


str.png

class DirectoryImages {
      //Създава свойствата
      public $filearray = array();
}

Дефинираме конструктор за класа


Името на конструктора може да съвпада с името на класа.

str.png
//Създава конструктор 
function DirectoryImages( $directory){
  $d = "";
if(is_dir($directory)){
$d = opendir($directory)
or die("
Директорията не може да бъде отворена.");
while(false !== ($f=readdir($d))){
if(is_file("$directory/$f")){
$this-> filearray[] = $f;
}
}
closedir($d);
}else{
//грешка
die("Трябва да премина през директорията.");
}

Конструкторът приема като параметър променливата $directory- името на директорията. Всички файлове, които се съдържат в директорията, се добавят към променливата $filearray. Променливите $d и $f са локални за конструктора и обръщението към тях е като към нормална РНР променлива. Случаят с $filearray е различен. Обръщението към нея, трябва да стане с $this-> .

Функциите, които съм използвала за работа с директорията images са:
  • opendir()- отваря директория;
  • readdir()- чете директория;
  • is_file()- извлича всички файлове от директорията и ги поставя като членове на масива filearray[];
  • closedir()- затваря директорията.

Дефинираме останалите методи на класа


Кои ще са останалите методи? Необходимо ни е да сортираме изображенията по азбучен ред, да проверим дали всички файлове в директорията са изображения и да изведем само изображенията. За всяко едно от тези действия, които трябва да извършим, ни е необходим метод (респ. функция), който ще извършва това действие.

str.png
//Сортира масива
function naturalCaseInsensitiveOrder(){ 
natcasesort($this->filearray); 
} 

//Проверява дали файловете в директорията са изображения
function checkAllImages(){ 
$bln = true; 
$extension = ""; 
$types = array( "jpg", "jpeg", "gif", "png"); 
foreach ($this->filearray as $key => $value){ 
$extension = substr($value,(strpos($value, ".") + 1)); 
$extension = strtolower($extension); 
if(!in_array($extension, $types)){ 
$bln = false; 
break; 
} 
} 
return $bln; 
}

//Извежда изображенията 
function setDirectoryImage(){
 if ($bln = true)
  foreach ($this-> filearray as $value){
echo "<div style=\"color:red; float:left;text-align:center; 
\"><img style=\" margin: 10px 10px 10px 10px;\" 
src=\"images/$value\"/><br><br><span><small>
Име на файла:</small></span><small> 
$value</small><br><br></div>";
}


Файлът, който ще съдържа class DirectoryImages {}, съм наименувала DirectoryImages.php.

Създаваме обект от клас DirectoryImages {}


Във файл index.php ще създам обект от клас DirectoryImages и ще извикам функциите, работещи с него.

str.png
<html>
<head>
<title>Работа с изображения</title>
<meta charset="UTF-8">
</head>
<body>

<?php
require 'DirectoryImages.php';

$di = new DirectoryImages('images');
$di->checkAllImages() or die("Не всички файлове са изображения.");
$di-> naturalCaseInsensitiveOrder();
$di->setDirectoryImage();
?>

</body>
</html>


Едно от предназначенията на файла index.php е да създаде нов обект, принадлежащ на клас DirectoryImages, поради тази причина, с помощта на контролната структура require включваме файл DirectoryImages.php.
Следващите стъпки:

Създава се нов обект.
Извиква се метод, който проверява дали всички файлове в директорията са изображения.
Извиква се метод, който сортира изображенията във възходящ ред.
Извиква се метод, който извежда изображенията на екрана.

Файловете DirectoryImages.php и index.php, може да изтеглите от тук:

При изпълнението на скрипта от файл index.php, резултатът в браузъра ще е:

Directory-Images.png

За динамично създаване на изображения, РНР поддържа библиотеката GD library- библиотека с отворен код. Повече можете да прочетете на: https://libgd.github.io и http://php.net и след това да приложите наученото, преработвайки скрипта от този линк: Работа с библиотеката GD.

sign.png

Няма коментари:

Публикуване на коментар