Оглавление

Задача

Необходимо загрузить по ссылке файл изображения, при этом проверить его на допустимое разрешение (размер) и вес файла.

Решение

Для решения поставленной задачи будем использовать возможности 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. После их можно записать в БД и работать с в дальнейшем.

Другие решения
Публикация записей с сайта в Telegram-канал

Публикация записей с сайта в Telegram-канал

Как автоматически публиковать посты в телеграм канал

Вывод блока недавно просмотренных товаров 1С Битрикс

Вывод блока недавно просмотренных товаров 1С Битрикс

Как вывести недавно просмотренные товары в произвольном месте сайта

Установить водяной знак на изображение в 1С Битрикс

Установить водяной знак на изображение в 1С Битрикс

Как установить водяной знак на изображение на лету (перед показом пользователю), не трогая сам оригинал


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке