Оглавление
Задача
Необходимо загрузить по ссылке файл изображения, при этом проверить его на допустимое разрешение (размер) и вес файла.Решение
Для решения поставленной задачи будем использовать возможности CURL php.
<?
//Допустимые типы изображений
$allowedContentType = ['image/jpeg', 'image/png', 'image/png'];
$arImgPath = []; //Массив URL изображений полученный из базы или путём парсинга документа
$tempFilePath = $_SERVER['DOCUMENT_ROOT'] . '/some_folder/'; //Папка для хранения временных файлов
$errorMsg = []; //Массив сообщений об ошибках, в дальнейшем его можно записать в лог или вывести на экран
$maxWeight = 2; //Максимальный вес файла в мегабайтах
$maxWidth = 1500; //Максимальная ширина изображения в пикселях
$maxHeight = 1500; //Максимальная высота изображения в пикселях
foreach ($arImgPath as $imgKey => $imgPath){
//Очищаем экранированные слеши
$imgPath = stripcslashes($imgPath);
$ext = pathinfo($imgPath, PATHINFO_EXTENSION);
//Путь и имя временного файла
$tmpFile = $tempFilePath . 'image-'. $imgKey . '.' . $ext;
$curl = curl_init($imgPath);
$fp = fopen($tmpFile, 'wb');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_BINARYTRANSFER,1);
//Получаем данные curl
$data = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
//Флаг удаления временного файла
$removeFile = false;
if($httpCode == 200){
fwrite($fp, $data);
fclose($fp);
$info = getimagesize($tmpFile);
$fileWeight = round(filesize($tmpFile) / 1024)/1000;
//Проверяем что тип полученного файла входит в диапазон допустимых значений
if(in_array($info['mime'], $allowedContentType)){
//Проверяем размер
if($fileWeight < $maxWeight){
//На основе данных в $info вы можете реализовать дополнительные проверки
if($info[0] <= $maxWidth && $info[1] <=$maxHeight){
//Сохраняем файл, someFuntion - некая функция сохранения
//она может быть уже реализована для вашей CMS или вы можете написать её самостоятельно,
//обычно таким функциям на вход нужно подать адрес временно сохранённого файла
$arImg[] = someFuntion($tmpFile);
} else {
$errorMsg[] = 'Слишком большое разрешение. Разрешение файла не должно превышать 1500x1500px, текущее разрешение: ' . $info[0] . 'x' . $info[1] . 'px' ;
$removeFile = true;
}
} else {
$errorMsg[] = 'Недопустимый вес файла, файл должен быть менее 2 Мб, текущий вес файла: ' . $fileWeight . ' Мб';
$removeFile = true;
}
} else {
$errorMsg[] = 'Недопустимый формат файла ' . $info['mime'];
$removeFile = true;
}
} else {
$errorMsg[] = 'Невозможно получить файл, код ответа ' . $httpCode;
$removeFile = true;
}
//Удаляем файл не прошедший проверку
if($removeFile){
unlink($tmpFile);
}
}
Если у вас нет специализированной функции someFuntion()
можете задать постоянный путь сохранения в переменной $tempFilePath
и передать в $arImg
пути уже скачанных файлов $tmpFile
. После их можно записать в БД и работать с в дальнейшем.