Загрузить изображение на сервер через iframe без перезагрузки страницы (jq, php)

В этой статье я опишу процесс загрузки изображения на сервер без обновления страницы средствами php (можно переделать под загрузку файлов с любым, нужным вам, расширением).
Для данного примера нам понадобится форма с полем для указания пути к файлу и кнопкой загрузки файла. Так же на странице будет располагаться тег для отображения загруженной картинки и сам iframe, через который, собственно, и будет происходить загрузка изображения без обновления страницы.
По началу я негативно относился к расположению на странице поля iframe, но это исключительно предубеждения и ничего плохого он нам не сделает, даже не помешает, т.к. будет скрыт.
Html:
<form method="post" enctype="multipart/form-data" action="work.php" target="imgframe"> <input type="file" id="img_src" required="required" accept="image" name="img_src"> <input type="submit" value="Загрузить" /> </form> <img id="image" src="" /> <iframe style="visibility: hidden; display: none;" id="imgframe" name="imgframe"> </iframe>
JavaScript:
Чтобы после загрузки изображения отобразить его, воспользуемся небольшим JavaScript, который будет вызываться из iframe при получении ответа от сервера о том, что изображение загружено.
function work(obj) { $("#image").attr("src", obj); }
Php:
Здесь я сделал свою небольшую проверку на соответствие расширения файла необходимому и преобразовал имя файла в md5 так же для минимальной защиты от загрузки файлов php скриптов под видом картинок.
<?php // work.php header("Content-Type:text/html;charset=UTF-8"); // Кодирока if ($_SERVER['REQUEST_METHOD'] == 'POST') { // Если POST запрос if ($_FILES['img_src']){ // Есть ли файл // Моя небольшая проверка и преобразование имени $up_dir = './img/'; // Папка для загрузки $wl = array('.jpeg', '.jpg', '.png', '.gif'); // Белый список расширений $real_name = $_FILES['img_src']['name']; // Имя файла $ext = '.'.mb_strtolower(pathinfo($real_name, PATHINFO_EXTENSION)); // Расширение $up_file = md5($real_name).$ext; // Имя файла в md5 + его расширение if (in_array($ext, $wl)){ // Если расширение есть в белом списке if (move_uploaded_file($_FILES['img_src']['tmp_name'], $up_dir.$up_file)) { // Файл загружен, выполняем скрипт на странице echo '<script> window.top.work("'.$up_dir.$up_file.'"); </script>'; } else { / Ошибка при загрузке } } else { // Не корректное расширение } } } ?>