Как сформировать компактный код загрузки аватарки?

Приветствую всех, имеется html форма

<div class="add-box-download">
			<form id="js-form" method="POST">
				<div class="example-1">
					<div class="form-group">
					    <label class="label"> 
					    	<img src="../img/page/photo.png">
					      	<input id="js-file" type="file" name="file" data="1">
					      	<p>Выберите картинку в формате JPG, GIF или PNG</p>
					    </label>
					</div>
				</div>
			</form>
		</div>
		<script src="js/load.js"></script>

Имеется JS код (Взят с инета и он слишком большой для вставки сюда) поэтому вот ссылка на файл

https://dropmefiles.com/JBZHi

и имеется PHP обработчик
<? $file = @$_FILES['file'];
$error = $success = '';

function translit($str) {
    $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
    $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
    return str_replace($rus, $lat, $str);
 }
 
// Директория, куда будут загружаться файлы.
$path = $_SERVER["DOCUMENT_ROOT"] . '/img/wish/';
 
if (!empty($file)) {

	// Разрешенные расширения файлов.
	$allow = array('jpg', 'jpeg', 'png');
	$elem = explode(".", $file['name']); $filter = strtolower(array_pop($elem));
	if ($file['size'] < 10240) {echo $error = 'Недопустимый размер загружаемого файла!'; exit;}
	if(!is_numeric(array_search($filter, $allow))) {echo $error = 'Загружаемый файл не является изображением!'; exit;}

	$imageinfo = getimagesize($file['tmp_name']);
	if($imageinfo['mime'] != 'image/jpg' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/png') 
	{echo $error = 'Данный тип файла запрещен!'; exit;}

	$tmp_name = strip_tags($file['tmp_name']);
	$tmp_name = htmlspecialchars($file['tmp_name']);
	// Проверим на ошибки загрузки.
	if (!empty($file['error']) || empty($tmp_name)) {
		switch (@$file['error']) {
			case 1:
			case 2: $error = 'Превышен размер загружаемого файла.'; break;
			case 3: $error = 'Файл был получен только частично.'; break;
			case 4: $error = 'Файл не был загружен.'; break;
			case 6: $error = 'Файл не загружен - отсутствует временная директория.'; break;
			case 7: $error = 'Не удалось записать файл на диск.'; break;
			case 8: $error = 'PHP-расширение остановило загрузку файла.'; break;
			case 9: $error = 'Файл не был загружен - директория не существует.'; break;
			case 10: $error = 'Превышен максимально допустимый размер файла.'; break;
			case 11: $error = 'Данный тип файла запрещен.'; break;
			case 12: $error = 'Ошибка при копировании файла.'; break;
			default: $error = 'Файл не был загружен - неизвестная ошибка.'; break;
		}
	} elseif ($tmp_name == 'none' || !is_uploaded_file($tmp_name)) {$error = 'Не удалось загрузить файл.';} else {

		$pattern = "[^A-Za-z0-9\.\-]";
		$name = mb_eregi_replace($pattern, '', $file['name']);
		$name = mb_ereg_replace('[-]+', '', $name);
 
		$parts = pathinfo($name);
		if (empty($name) || empty($parts['extension'])) {$error = 'Не удалось загрузить файл!';} 
		elseif (!empty($allow) && !in_array(strtolower($parts['extension']), $allow)){$error = 'Недопустимый тип файла';} else{

			$names = explode(".", $name);
			$filename = translit($names[0]);
			$img = $filename.'.'.$names[1];

			// Перемещаем файл в директорию.
			if (move_uploaded_file($tmp_name, $path.$img)) {$success = 'Файл '.$name.' успешно загружен.';}
			else {$error = 'Не удалось загрузить файл.';}
		}
	}
 
	// Выводим сообщение о результате загрузки.
	if (!empty($success)) {echo $success;}
	else {echo $error;}
}

include $_SERVER['DOCUMENT_ROOT'].'/core/function.php';

if (isset($data['id'])) {

	$files_img = implode($data['filename']);
	$names = explode(".", $files_img);
	$filename = translit($names[0]);
	$img = $filename.'.'.$names[1];

	if(R::count('wish', "photo = ?", array($img)) > 0) {exit;} 
		else if (R::count('wish', "name = ?", array('-')) == 0) {

		$wish = R::dispense('wish');
		$wish->name = '-'; 												# Название желаемого
		$wish->price = '-'; 											# Стоимость желаемого
		$wish->photo = $img; 											# Название картинки
		$wish->time = date('d.m.Y h:i:s', time());						# Дата публикации
		R::store($wish);
		
		message($img, 'error');
	} else {
		$sql = mysqli_query($CONNECT, "UPDATE `wish` SET `photo` = '$img' WHERE `photo` = '-'");
		message($img, 'error');
	}
}


Как видите код слишком громоздкий и я больше чем уверен что тут куча мусора и вообще не нужного более чем. Есть ли возможность реализовать аналог или может этот как то по путнему можно обработать?
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
Как проще всего это реализовать:
1. поставь лимит на файл в 100-200Кб
2. проверь что загружаемый файл является картинкой например пережми с помощью GD2 или Imagick
3. содержимое файла перекодируй в base64
4. сохрани base64 в базу

Для аватарок это более чем достаточно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Я бы не делал транслитерацию и проверку расширения. Вместо транслитерации генерировать название изображения на основе user_id, расширение вообще не проверять, - удалось прочитать картинку - отлично, конвертируем в единый для сайта формат. (конвертации у вас, кстати, нет, и вполне возможна загрузка rarjpeg или чего повеселее) Не удалось - неподдерживаемый формат. Проверка размера тоже не особо нужна.
Половину ошибок текстовых можно спрятать от пользователя, незачем ему видеть что "Не удалось записать файл на диск", такие ошибки должны отправляться в мониторинг или админу на почту.
Остальное вроде как стремно выбрасывать, вполне возможны случаи когда вместо картинки вам загрузят что-то другое.

Какой-то сюр при записи в БД - вместо UPDATE USER почему-то вставка в таблицу wish(?), с прочерками в полях и цене(?!).

Было даже интересно что там за навороченная загрузка фоточек на 46кб. Может там полновесный фоторедактор? Потому что кроме кропа и парочки фильтров при загрузке аватарки сложно что-то придумать. но мало-ли.
Оказалось загрузчик занимает строчек 20, и в нем только jQuery.post и вывод парочки сообщений. Остальное место занято jQuery выпуска 2014 года. Вы вообще пытаетесь понять что вы делаете, или просто тащите всякий хлам из этих ваших интернетов в надежде, что оно как-то само заработает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы