Для лэндинг страниц и сайтов не желательна перезагрузка страницы при отправке форм. Лучше когда пользователь сразу видит результат работы на странице.
Имеем страницу и на ней форму
<div class="constructor-form-2"> <h3 class="calculate-work-title">Рассчитать стоимость работы</h3> <div class="form-2-wrap"> <form action="" id="raschet_sr" enctype="multipart/form-data"> <div class="form-field input-form-field"> <label for="name">Имя:</label> <input id="name" name="name" type="text" placeholder="Инакентий"/></div> <div class="form-field input-form-field"> <label for="auto-brand">Бренд автомобиля:</label> <select name="auto-brand" id="auto-brand"> <option value="Audi">Audi</option> <option value="BMW">BMW</option> <option value="Hammer">Hammer</option> <option value="ВАЗ">ВАЗ</option> </select> </div> <div class="form-field input-form-field"><label for="tel">Телефон:</label><input id="tel" name="tel" type="tel"/></div> <div class="form-field input-form-field"> <label for="auto-type">Марка автомобиля:</label> <select name="auto-type" id="auto-type"> <option value="A3">A3</option> <option value="350">350</option> <option value="H3">H3</option> <option value="21010">21010</option> </select> </div> <div style="display:none;background:#fff;float:left;width:200px;height:155px;position:absolute;left:100px;" id="pv_div"><img src="" style="width:180px;height:135px;margin:10px;" id="pv_img"></div> <div class="form-field broken-item"><label for="broken-item">Прикрепите фото поврежденной детали:</label><input id="broken-item" name="broken-item" type="file"/></div> <div class="form-field order-field"> <button id="order-btn-2" type="submit" name="ORDER_2" value="order_2">Рассчитать стоимость ремонта</button> </div> </form> </div> </div>
Здесь стоит уделить внимание блоку
<div style="display:none;background:#fff;float:left;width:200px;height:155px;position:absolute;left:100px;" id="pv_div"> <img src="" style="width:180px;height:135px;margin:10px;" id="pv_img"> </div>
Этот блок будет отображаться после загрузки фото и атрибут src у img будет подставляться после получения имени файла.
Самое главное для форм с загрузкой файлов это
<form action="" id="raschet_sr" enctype="multipart/form-data">
указание enctype
<input id="broken-item" name="broken-item" type="file"/>
Само поле для выбора файла
Обычно после нажатия на кнопку формы происходит отправка данных формы скрипту и там происходит загрузка файла на сервер и после этого результат можно показать пользователю.
Но здесь мы постараемся отобразить фото пользователя прямо после выбора фотографии пользователем. Для этого будем использовать jQuery:
Не забываем подключать в head jQuery
<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
и в head напишем следующий код
$(document).ready(function(){
$(document).on("change", "#broken-item", function(){
fdata = new FormData();
fdata.append('broken-item', $('#broken-item')[0].files[0]);
$.ajax({ type: "POST", url: "/al_foto.php",data: fdata, dataType: 'json', processData: false,contentType: false,
success: function(data){
if (data.err==""){
$("#pv_img").attr("src","/upload/"+data.file);
$("#pv_div").show();
}
}
});
return false;
});
});
Здесь вешаем обработчик на тэг с id = broken-item событие change. Т.е. после изменения этого элемента (выбор файла) будем делать следующее:
fdata = new FormData(); // Создадим массив данных для отправки формы
fdata.append(‘broken-item’, $(‘#broken-item’)[0].files[0]); // добавим к массиву элемент broken-item с нашим файлом $(‘#broken-item’)[0].files[0] — именно так его писать, по другому не получалось.
Т.е. обычным serrialize не получится передать поле file в ajax отправке данных.
fdata.append — можно формировать свою форму — элемент и значение
Далее стандартный $.ajax в нем не забываем указать processData: false,contentType: false,
dataType: ‘json’ — необходимо для лучшего разбора данных
$(«#pv_img»).attr(«src»,»/upload/»+data.file); //меняем src у img
$(«#pv_div»).show(); //отображаем блок с фото
Файл al_foto.php
if (isset($_FILES["broken-item"])){//ПОДГРУЗКА ФОТО
$rez=array(); $rez['err']=''; $rez['file']='';
if($_FILES["broken-item"]["size"] > 1024*3*1024){
$rez['err'] = "Размер файла превышает три мегабайта";
}
if($rez['err']==''){
$fileName = $_FILES["broken-item"]['name'];
if(is_uploaded_file($_FILES["broken-item"]["tmp_name"])){
move_uploaded_file($_FILES["broken-item"]["tmp_name"], "upload/".$fileName);
$rez['file'] = $fileName;
} else {
$rez['err'] = "Ошибка загрузки файла ".$_FILES["broken-item"]["tmp_name"];
}
}
echo json_encode($rez);
exit;
}
Здесь проверяем есть ли загрузка файла?
Проверяем на размер файла, если превышает тогда сохраняем ошибку.
Проверяем на существование ошибок, если нет тогда загружаем файл.
$rez[‘file’] = $fileName; — сохраняем имя файла
Оператор echo json_encode($rez); выводит в браузер закодированные данные массива в формате json, чтобы мы в javascript смогли легче их получить.