Мой друг-фотограф умолял меня найти и скачать изображения рамок для картин из интернета. В конце концов я попал на веб-страницу, на которой было несколько бесплатных номеров, но возникла проблема: ссылки для загрузки всех изображений вместе не было.
Я не хотел проходить стресс при загрузке изображений по отдельности, поэтому я написал этот класс 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-архив. Если у вас есть альтернативные решения или предложения по улучшению, пожалуйста, оставьте их в комментариях ниже, все отзывы приветствуются!