Как сформировать компактный код загрузки аватарки?
Приветствую всех, имеется 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> |
<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'); } } |
<? $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'); } }
Как видите код слишком громоздкий и я больше чем уверен что тут куча мусора и вообще не нужного более чем. Есть ли возможность реализовать аналог или может этот как то по путнему можно обработать?
Дополнительно:
P.S в целом код рабочий, вопрос заключается в объемности
Как проще всего это реализовать:
1. поставь лимит на файл в 100-200Кб
2. проверь что загружаемый файл является картинкой например пережми с помощью GD2 или Imagick
3. содержимое файла перекодируй в base64
4. сохрани base64 в базу
Для аватарок это более чем достаточно.
Ответы:
Я бы не делал транслитерацию и проверку расширения. Вместо транслитерации генерировать название изображения на основе user_id, расширение вообще не проверять, - удалось прочитать картинку - отлично, конвертируем в единый для сайта формат. (конвертации у вас, кстати, нет, и вполне возможна загрузка rarjpeg или чего повеселее) Не удалось - неподдерживаемый формат. Проверка размера тоже не особо нужна.
Половину ошибок текстовых можно спрятать от пользователя, незачем ему видеть что "Не удалось записать файл на диск", такие ошибки должны отправляться в мониторинг или админу на почту.
Остальное вроде как стремно выбрасывать, вполне возможны случаи когда вместо картинки вам загрузят что-то другое.
Какой-то сюр при записи в БД - вместо UPDATE USER почему-то вставка в таблицу wish(?), с прочерками в полях и цене(?!).
Было даже интересно что там за навороченная загрузка фоточек на 46кб. Может там полновесный фоторедактор? Потому что кроме кропа и парочки фильтров при загрузке аватарки сложно что-то придумать. но мало-ли.
Оказалось загрузчик занимает строчек 20, и в нем только jQuery.post и вывод парочки сообщений. Остальное место занято jQuery выпуска 2014 года. Вы вообще пытаетесь понять что вы делаете, или просто тащите всякий хлам из этих ваших интернетов в надежде, что оно как-то само заработает?
- Какой-то сюр при записи в БД - вместо UPDATE USER почему-то вставка в таблицу wish(?), с прочерками в полях и цене(?!). - Это RedBeanPHP добавление записей в бд и условие, если текст был добавлен первым и картинка обновляется, либо изображение попадает первым, исходник взят со старого скрипта для реализации загрузки аватарки в новый проект
По загрузке изображений: для меня это пока густой лес и приходится все изымать из интернета, собственно вот и прошу у вас помощи(
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания компактного кода загрузки аватарки на сайте можно воспользоваться следующим подходом в языке программирования PHP:
if ($_FILES['avatar']['error'] === UPLOAD_ERR_OK) { $file_tmp_name = $_FILES['avatar']['tmp_name']; $file_name = $_FILES['avatar']['name']; $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); $upload_path = 'uploads/'; // Генерируем уникальное имя файла $new_file_name = uniqid() . '.' . $file_extension; // Перемещаем файл из временной директории в указанную if (move_uploaded_file($file_tmp_name, $upload_path . $new_file_name)) { echo 'Файл успешно загружен.'; } else { echo 'Ошибка при загрузке файла.'; } } else { echo 'Произошла ошибка при загрузке файла.'; }
В данном коде мы проверяем, что файл был успешно загружен на сервер (UPLOAD_ERR_OK), затем получаем временное имя файла, его имя и расширение. Далее указываем путь для сохранения загруженного файла. Сгенерировав уникальное имя файла, мы перемещаем его из временной директории в папку uploads. В случае успешной загрузки файла выводим сообщение об успехе, в противном случае - сообщение об ошибке.
Такой подход позволяет сформировать компактный и эффективный код для загрузки аватарки на сайт.