Отправка файла на почту через модальное окно
Доброго времени суток! Нашла для своего сайта модальное окно с формой обратной связи на jQuery плагин fancybox. Все работает отлично, но вот пытаюсь сделать отправку файлов через это окно и у меня не получается. Файлы не отправляются. Хотя сам php файл отдельно без модального окна отправляет файлы. Перерыла кучу форумов, но ничего не нашла по этому вопросу. Может в этом случает отправка не возможна? помогите разобраться! заранее спасибо!!
вот код <div id="wrapper"><a class="modalbox" href="#inline">Оставить заявку</a></div> <div id="inline"> <span class="title">Оставить заявку</span> <form enctype="multipart/form-data" method="post" id="contact" name="contact" action="#"> <label for="fio">Представьтесь</label><br> <input id="fio" name="fio" class="txt"> <br> <label for="email">Ваш E-mail*</label><br> <input type="email" id="email" name="email" class="txt"> <br> <label for="tel">Номер телефона</label><br> <input id="tel" name="tel" class="txt"> <br> <label for="msg">Введите сообщение</label> <textarea id="msg" name="msg" class="txtarea"></textarea> <label for="fileFF">Прикрепить файл:</label> <input type="file" name="fileFF[]" multiple id="fileFF" class="txt"> <button id="send">Отправить заявку</button> </form> </div> <!-- basic fancybox setup --> function validateEmail(email) { var reg = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return reg.test(email); } $(document).ready(function() { $(".modalbox").fancybox(); $("#contact").submit(function() { return false; }); $("#send").on("click", function(){ var emailval = $("#email").val(); var msgval = $("#msg").val(); var msglen = msgval.length; var mailvalid = validateEmail(emailval); if(mailvalid == false) { $("#email").addClass("error"); } else if(mailvalid == true){ $("#email").removeClass("error"); } if(mailvalid == true ) { // если обе проверки пройдены // сначала мы скрываем кнопку отправки $("#send").replaceWith("<em>отправка...</em>"); $.ajax({ type: 'POST', url: 'sendmessage.php', data: $("#contact").serialize(), success: function(data) { if(data == "true") { $("#contact").fadeOut("fast", function(){ $(this).before("Вашa заявка отправлена! Наш специалист свяжется с Вами!"); setTimeout("$.fancybox.close()", 4000); }); } else if(data == "false") { $("#contact").fadeOut("fast", function(){ $(this).before("Ошибка!"); setTimeout("$.fancybox.close()", 4000); }); } else { $("#contact").fadeOut("fast", function(){ $(this).before("Неизвестно! :("); setTimeout("$.fancybox.close()", 4000); }); } } }); } }); }); и файл sendmessage.php $to = "name@yandex.ru"; // поменять на свой адрес $from = $_POST['email']; $subject = "Заполнена контактная форма с ".$_SERVER['HTTP_REFERER']; $message = "Имя: ".$_POST['fio']."\nEmail: ".$from."\nIP: ".$_SERVER['REMOTE_ADDR']."\nСообщение: ".$_POST['msg']; $boundary = md5(date('r', time())); $filesize = ''; $headers = "MIME-Version: 1.0\r\n"; $headers .= "From: " . $from . "\r\n"; $headers .= "Reply-To: " . $from . "\r\n"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; $message=" Content-Type: multipart/mixed; boundary=\"$boundary\" --$boundary Content-Type: text/plain; charset=\"utf-8\" Content-Transfer-Encoding: 7bit $message"; for($i=0;$i<count($_FILES['fileFF']['name']);$i++) { if(is_uploaded_file($_FILES['fileFF']['tmp_name'][$i])) { $attachment = chunk_split(base64_encode(file_get_contents($_FILES['fileFF']['tmp_name'][$i]))); $filename = $_FILES['fileFF']['name'][$i]; $filetype = $_FILES['fileFF']['type'][$i]; $filesize += $_FILES['fileFF']['size'][$i]; $message.=" --$boundary Content-Type: \"$filetype\"; name=\"$filename\" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=\"$filename\" $attachment"; } } $message.=" --$boundary--"; if ($filesize < 10000000) { // проверка на общий размер всех файлов. Многие почтовые сервисы не принимают вложения больше 10 МБ mail($to, $subject, $message, $headers); echo 'true'; } else { echo 'false'; } |
Что вам подсовывают в поле email, нужно обязательно проверять на сервере, проверка на клиенте, это сервис для него не более того.
$subject = "Заполнена контактная форма с ".$_SERVER['HTTP_REFERER']; - на тему почтового отправления не влияет указываемая в заголовках (кстати вы его не передаете) кодировка, и оно может быть отображено почтовым сервером или клиентом как душе угодно, этот параметр нужно кодировать: $subject = '=?utf-8?b?' . base64_encode("Заполнена контактная форма с ".$_SERVER['HTTP_REFERER']) . '?='; как подвергают такой кодировке и поле From. $attachment = chunk_split(base64_encode(file_get_contents($_FILE S['fileFF']['tmp_name'][$i]))); - загрузку файлов нужно не с этого начинать, а с проверки загружен ли файл вообще, то есть нет ли ошибки в ключе $_FILES['fileFF']['error']. Загружать тело файла функцией file_get_contents() не стоит, открывайте файл на чтение. if ($filesize < 10000000) { // проверка на общий размер всех файлов. - это нужно проверять до формирования почтового отправления, ибо, если размер превышает допустимое, то впустую будет потрачено и время, и ресурсы, да и пользователя по этому вопросу вы оставляете в неведении. Если у вас РНР версии не ниже 5.5, то это можно сделать функцией array_column(), если ниже, то использовать это: function array_column($a, $i, $k=null) { return array_values(array_diff(array_map(function($a, $b) use($i, $k) { return $k ? [$b => $a[$i]] : $a[$i]; }, $a, array_keys($a)), [null])); } получив ключи 'size' массива $_FILES['fileFF'] и суммируя их значение. По отправлению на сервер - а что говорит отладчик? |
laimas, Спасибо большое за ответ, учла все ваши комментарии.
Нашла решение проблемы здесь же на форуме http://javascript.ru/forum/jquery/40...v-s-formy.html, аналогичная ошибка. Дело в том, что метод serialize не передает данные о файле, для отправки файла надо использовать FormData() |
Цитата:
PS. Кстати, файлы перед отправкой можно было бы поместить и в архив. |
Часовой пояс GMT +3, время: 09:15. |