Делая какой-либо парсер на PHP часто приходится сталкиваться с изображениями на странице. В ручную сохранять изображения слишком долго и не продуктивно. В PHP есть несколько функции которые могут помочь быстро и главное безопасно сохранить изображения у себя на хостинге. Принцип работы скрипта прост, заходим по ссылке изображения, проверяем если нет уже такого файла в нашей папке и потом сохраняет его в нужном расширении.
Скачать скрипт из сатьи
Всю работу на себя возьмет обычная функция, такой подход считается плохим тоном с точки зрения правильного программирования т.к. одна функция должна выполнять одну задачу. Я мог выполнить нашу задачу используя классы, но "открыть банку краном" не целесообразно.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php /** ======================= ** Скрипт: Сохранить изображения из интернета ** Источник: Live-code.ru ** ======================= **/ function SaveImage($url) { $dir = 'images/'; // открываем содержимое файла по ссылке $Image = @file_get_contents($url); if(!$Image) { return "Не удалось получить данные файла по ссылке"; } else { // Получаем название файла $ExplodeUrl = explode("/", $url); $FileName = $ExplodeUrl[count($ExplodeUrl)-1]; // Проверяем если есть такой файл в папке с картинками // если есть, добавляем случайные числа в название // тем самым делая её уникальной if(file_exists($dir.$FileName)) { $FileName = rand(10000000, 99999999).$FileName; } // Сохраняем файл $CreateNewFile = fopen($dir.$FileName, "w+"); $WriteInFile = fwrite($CreateNewFile, $Image); return $FileName; } } echo Saveimage("http://live-code.ru/uploads/twitter.png"); ?> |
Стоило бы учесть, что папка images в которой будут сохранятся изображения должна быть с правами 777, иначе получите ошибку во время работы функции fopen
Функции file_get_contents запрещено выдавать сообщение об ошибке с помощью "@" т.к. в случае несуществующей ссылки или файла, выдать пользователю человеческий текст об ошибке.
Обратите внимание как без использования регулярных выражений, мы получили название последнего файла из адресной строки. Подробный пример:
1 2 3 4 5 6 7 8 9 10 |
<?php $Url = "http://live-code.ru/uploads/twitter.png"; $ExplodeUrl = explode("/", $Url); echo $ExplodeUrl[count($ExplodeUrl)-1]; // получим: twitter.png echo $ExplodeUrl[count($ExplodeUrl)-2]; // получим: uploads echo $ExplodeUrl[count($ExplodeUrl)-3]; // получим: live-code.ru echo $ExplodeUrl[count($ExplodeUrl)-5]; // получим: http: ?> |
Почему мы добавили случайные числа к названию файла?
Если название файла не найдена в папке с изображениями, тогда файл сохраняется с его оригинальным именем, иначе файлу в начало добавляется случайное число с помощью функции rand(), для того, чтобы сделать имя файла уникальным тем самым не заменяя содержимого уже существующего файла с таким именем.