Статьи

Очистка изображений с помощью Symfony’s DomCrawler

Мой друг-фотограф умолял меня найти и скачать изображения рамок для картин из интернета. В конце концов я попал на веб-страницу, на которой было несколько бесплатных номеров, но возникла проблема: ссылки для загрузки всех изображений вместе не было.

Я не хотел проходить стресс при загрузке изображений по отдельности, поэтому я написал этот класс PHP для поиска, загрузки и архивирования всех изображений, найденных на сайте.

Как работает класс

Он ищет в URL изображения, загружает и сохраняет изображения в папке, создает ZIP-архив папки и, наконец, удаляет папку.

Класс использует компонент Domcrawler Symfony для поиска всех ссылок на изображения, найденных на веб-странице, и пользовательскую zip function которая создает файл zip. Благодарим Дэвида Уолша за функцию почтового индекса.

Кодирование класса

Класс состоит из пяти частных свойств и восьми открытых методов, включая магический метод __construct .

Ниже приведен список свойств класса и их роли.
1. $folder : хранит имя папки, в которой хранятся скопированные изображения.
2. $url : хранит URL веб-страницы.
3. $html : хранит HTML-код документа веб-страницы, которую нужно очистить.
4. $fileName : хранит имя файла ZIP.
5. $status : сохраняет статус операции. Т.е. был ли это успех или неудача.

Давайте начнем строить класс.

Создайте класс ZipImages содержащий пять указанных выше свойств.

 <? php class   ZipImages   { 
     private  $folder ; 
     private  $url ; 
     private  $html ; 
     private  $fileName ; 
     private  $status ; 

Создайте магический метод __construct который принимает URL в качестве аргумента.
Метод довольно понятен.

 public   function  __construct ( $url )   { $this -> url =  $url ; $this -> html =  file_get_contents ( $this -> url ); $this -> setFolder (); 
 } 

В созданном ZIP-архиве есть папка, в которой хранятся изображения. Метод setFolder ниже настраивает это.

По умолчанию в качестве имени папки задано images но метод предоставляет возможность изменить имя папки, просто передав имя папки в качестве аргумента.

 public   function  setFolder ( $folder = "image" )   { 
     // if folder doesn't exist, attempt to create one and store the folder name in property $folder 
     if (! file_exists ( $folder ))   { mkdir ( $folder ); 
     } $this -> folder =  $folder ; 
 } 

setFileName предоставляет возможность изменить имя файла ZIP с именем по умолчанию, установленным на zipImages :

 public   function  setFileName ( $name =   "zipImages" )   { $this -> fileName =  $name ; 
 } 

На этом этапе мы создаем экземпляр компонента- crawler Symfony для поиска изображений, затем загружаем и сохраняем все изображения в папке.

 public   function  domCrawler ()   { 
     //instantiate the symfony DomCrawler Component $crawler =   new   Crawler ( $this -> html ); 
     // create an array of all scrapped image links $result =  $crawler -> filterXpath ( '//img' ) 
         -> extract ( array ( 'src' )); 

 // download and save the image to the folder 
     foreach   ( $result as  $image )   { $path =  $this -> folder . "/" . basename ( $image ); $file =  file_get_contents ( $image ); $insert =  file_put_contents ( $path ,  $file ); 
         if   (! $insert )   { 
             throw   new  \Exception ( 'Failed to write image' ); 
         } 
     } 
 } 

После завершения загрузки мы create_zip папку с изображениями в ZIP-архив, используя нашу собственную функцию create_zip .

 public   function  createZip ()   { $folderFiles =  scandir ( $this -> folder ); 
     if   (! $folderFiles )   { 
         throw   new  \Exception ( 'Failed to scan folder' ); 
     } $fileArray =  array (); 
     foreach ( $folderFiles as  $file ){ 
         if   (( $file !=   "." )   &&   ( $file !=   ".." ))   { $fileArray []   =  $this -> folder . "/" . $file ; 
         } 
     } 

     if   ( create_zip ( $fileArray ,  $this -> fileName . '.zip' ))   { $this -> status =   <<< HTML File  successfully archived .   < a href = "$this->fileName.zip" > Download  it now </ a > HTML ; 
     }   else   { $this -> status =   "An error occurred" ; 
     } 
 } 

Наконец, мы удаляем созданную папку после создания ZIP-файла.

 public   function  deleteCreatedFolder ()   { $dp =  opendir ( $this -> folder )   or   die   ( 'ERROR: Cannot open directory' ); 
     while   ( $file =  readdir ( $dp ))   { 
         if   ( $file !=   '.'   &&  $file !=   '..' )   { 
             if   ( is_file ( "$this->folder/$file" ))   { unlink ( "$this->folder/$file" ); 
             } 
         } 
     } rmdir ( $this -> folder )   or   die   ( 'could not delete folder' ); 
 } 

Получить статус операции. Т.е. если это было успешно или произошла ошибка.

 public   function  getStatus ()   { echo $this -> status ; 
 } 

Обработайте все методы, описанные выше.

 public   function  process ()   { $this -> domCrawler (); $this -> createZip (); $this -> deleteCreatedFolder (); $this -> getStatus (); 
 } 

Вы можете скачать полный класс с Github .

Зависимость класса

Чтобы класс работал, необходимо Domcrawler компонент create_zip функцию create_zip . Вы можете скачать код для этой функции здесь .

Загрузите и установите компонент DomCrawler через Composer, просто добавив следующую инструкцию require в свой файл composer.json :

 "symfony/dom-crawler" :   "2.3.*@dev" 

Запустите $ php composer.phar install чтобы загрузить библиотеку и сгенерировать файл автозагрузчика vendor/autoload.php .

Используя класс

  • Убедитесь, что все необходимые файлы включены, через автозагрузку или явно.
  • Вызовите setFolder и setFileName и передайте их соответствующие аргументы. setFolder метод setFolder только setFolder когда вам нужно изменить имя папки.
  • Вызовите метод process чтобы заставить класс работать.
 <? php require_once 'zipfunction.php' ; require_once 'vendor/autoload.php' ; 
     use   Symfony \Component\DomCrawler\Crawler ; require_once 'vendor/autoload.php' ; 

     //instantiate the ZipImages class $object =   new   ArchiveFile ( 'http://sitepoint.com' ); 
     // set the zip file name $object -> setFolder ( 'pictureFrames' ); 
     // set the zip file name $object -> setFileName ( 'myframes' ); 
     // initialize the class process $object -> process (); 

Резюме

В этой статье мы узнали, как создать простой PHP-скребок для изображений, который автоматически сжимает загруженные изображения в Zip-архив. Если у вас есть альтернативные решения или предложения по улучшению, пожалуйста, оставьте их в комментариях ниже, все отзывы приветствуются!