Ajax и отправка файлов с формы
Здравствуйте, Дорогие Форумчане!
Помогите, пожалуйста, разобраться. Я в javascript силен не сильно, можно сказать почти 0, в основном если что то делаю то пользуюсь jQuery, но и в нем еще не очень) Возникла у меня такая проблемка, есть у меня формочка обратной связи обычная, которая отправляет сообщения от пользователей ко мне на почту, происходит это через Ajax в php, все как обычно, и встала у меня необходимость, чтобы пользователи еще могли файлик прикладывать и вместе с сообщением мне на почту отсылать. Вставил я значит в форму строчку input type=file, в php дописал прицепление вложения к письму, и... без ajax все работает, а с ajax'ом не фига, вычитал что метод serialize, который передает данные формы, не передает данные о файле. Пытаюсь найти решение уже неделю но ни как не выходит.. Помогите решить проблемку, пожалуйста. Вот то что у меня есть: html: <form id="commentForm" class="form" method="post" action enctype="multipart/form-data"> <fieldset> <input type="text" placeholder="Имя:" value name="name"> <input id="email" type="text" placeholder="E-mail:" value name="email"> <label for="file">Приложите свое изображение:</label> <input id="file" type="file" value name="file"> <textarea placeholder="Ваши пожелания:" cols rows value name="message"></textarea> </fieldset> <input id="button" class="submit" type="submit" value="Отправить" name="submit"> </form> ajax jQuery(document).ready(function() { $("#commentForm").submit(function() { return false; }); $("#button").on("click", function(){ var emailval = $("#email").val(); var mailvalid = validateEmail(emailval); if(mailvalid == false) { $("#email").addClass("error"); } else if(mailvalid == true){ $("#email").removeClass("error"); } if(mailvalid == true) { $(".submit").replaceWith("<div class='form_dscr'><p class='sending'>Отправка...</p></div>"); $.ajax({ type: 'POST', url: 'mail.php', data: $("#commentForm").serialize(), success: function(data) { if(data == "true") { $(".sending").replaceWith("<p>Принято!<p>"); } else { $(".sending").replaceWith("<p>Ошибка! Обновите страницу...<p>"); } } }); } }); }); ну и mail.php <?php function mail_attachment($filename, $mailto, $from_mail, $from_name, $replyto, $subject, $message) { $file = $filename; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $uid = md5(uniqid(time())); $name = basename($file); $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n"; $header .= "This is a multi-part message in MIME format.\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-type:text/plain; charset=utf-8 \r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $header .= $message."\r\n\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n"; $header .= $content."\r\n\r\n"; $header .= "--".$uid."--"; return mail($mailto, $subject, "", $header); } $sendto = "my@mail.ru"; $username = $_POST['name']; $useremail = $_POST['email']; $usermsg = $_POST['message']; $subjectuser = "Сообщение"; $headersuser = "From: Сообщение\r\n"; $headersuser .= "Reply-To: ". strip_tags($username) . "\r\n"; $headersuser .= "MIME-Version: 1.0\r\n"; $headersuser .= "Content-Type: text/html;charset=utf-8 \r\n"; $my_file = ""; if (!empty($_FILES['file']['tmp_name'])) { $path = $_FILES['file']['name']; if (copy($_FILES['file']['tmp_name'], $path)) $my_file = $path; } $my_name = "Письмо с блога"; $my_mail = "my@mail.ru"; $my_replyto = "my@mail.ru"; $my_message = "Имя: ".$username."\r\nЕ-mail: ".$useremail."\r\nСообщение: ".$usermsg."\r\n"; if(@mail_attachment($my_file, $sendto, $my_mail, $my_name, $my_replyto, $subjectuser, $my_message)){ echo "true"; } else { echo "false"; } ?> |
miker059,
Для файлов аяксом serialize() - не проходит, курите FormData() |
|
Спасибо, ребят, помогло) получилось так
вот это: $.ajax({ type: 'POST', url: 'mail.php', data: $("#commentForm").serialize(), success: function(data) { if(data == "true") { $(".sending").replaceWith("<p>Принято!<p>"); } else { $(".sending").replaceWith("<p>Ошибка! Обновите страницу...<p>"); } } }); заменил на это: var form = document.forms.commentForm; var formData = new FormData(form); var xhr = new XMLHttpRequest(); xhr.open("POST", "mail.php"); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if(xhr.status == 200) { data = xhr.responseText; if(data == "true") { $(".sending").replaceWith("<p>Принято!<p>"); } else { $(".sending").replaceWith("<p >Ошибка! Обновите страницу...<p>"); } } } }; xhr.send(formData); теперь все работает, единственное как я понял метод FormData работает только на новых браузерах, хотя в принципе это не сильно важно. Еще раз спасибо! |
Благодарю за ваше решение.
Всё отлично работает в Chrome, Yandex и ДАЖЕ в IE ;) но.. Firefox отказывается отсылать почту. Есть мнения на этот счёт?! |
Цитата:
|
Часовой пояс GMT +3, время: 09:00. |