Javascript.RU

Создать новую тему Закрытая тема
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2015, 22:30
Аспирант
Отправить личное сообщение для zazula Посмотреть профиль Найти все сообщения от zazula
 
Регистрация: 07.05.2014
Сообщений: 40

Отправка файла на почту через модальное окно
Доброго времени суток! Нашла для своего сайта модальное окно с формой обратной связи на 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';  }
  #2 (permalink)  
Старый 29.07.2015, 00:22
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Что вам подсовывают в поле 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, 29.07.2015 в 01:44.
  #3 (permalink)  
Старый 29.07.2015, 13:51
Аспирант
Отправить личное сообщение для zazula Посмотреть профиль Найти все сообщения от zazula
 
Регистрация: 07.05.2014
Сообщений: 40

laimas, Спасибо большое за ответ, учла все ваши комментарии.
Нашла решение проблемы здесь же на форуме Ajax и отправка файлов с формы, аналогичная ошибка.
Дело в том, что метод serialize не передает данные о файле, для отправки файла надо использовать FormData()
  #4 (permalink)  
Старый 29.07.2015, 13:58
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от zazula
Дело в том, что метод serialize не передает данные о файле
Именно так, только не данные о файле, а не передает бинарные данные.

PS. Кстати, файлы перед отправкой можно было бы поместить и в архив.

Последний раз редактировалось laimas, 29.07.2015 в 14:03.
Закрытая тема



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Всплавающее модальное окно с группой подписчиков вконтакте ??? ilyas-> Элементы интерфейса 32 27.01.2015 14:01
нужно заставить одновременно работать слайдер и модальное окно обратной связи kvant355 Javascript под браузер 3 22.07.2013 16:34
Модальное окно на ajax Vladislav jQuery 1 27.03.2013 22:26
Передача данных из форм в модальное окно. andrey96 AJAX и COMET 5 16.11.2012 16:47
отправка файла через обработчик события submit starrich AJAX и COMET 2 13.08.2008 22:29