В IE8 (IE6 и IE7 не проверял) не создается массив $_FILES и соответственно не получается отправить вложение, хотя в Firefox и Google Chrome все работает отлично. Эта проблема возникает только при динамическом создании формы отправки электронной почты. Помогите найти ошибку ! При выборе пункта меню "Контакты" вызывается следующая JavaScript функция для создания формы отправки электронной почты: function Contacts(basicID, lang) { var TForm = document.createElement('form'); TForm.action = 'simple_mail.php'; TForm.enctype = 'multipart/form-data'; TForm.method = 'post'; TForm.target = 'mail_frame'; var Table = document.createElement('table'); Table.cellspacing = 0; Table.cellpadding = 0; Table.style.width = '100%'; var TBody = document.createElement('tbody'); var Row = document.createElement('tr'); var Td = document.createElement('td'); Td.style.border = 'solid 1px Gray'; Td.style.padding = '10px 10px 10px 10px'; var P = document.createElement('p'); P.id = 'TitleForm'; P.className = 'TitleForm'; P.appendChild(document.createTextNode(Resource[lang].Welcome)); Td.appendChild(P); var newElem = document.createElement('input'); newElem.id = 'labelEmail'; newElem.type = 'text'; newElem.className = 'Label'; newElem.size = 15; newElem.readOnly = true; newElem.value = Resource[lang].Email; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_from'; newElem.name = 'mail_from'; newElem.type = 'text'; newElem.className = 'Field'; newElem.size = 30; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'labelTheme'; newElem.type = 'text'; newElem.className = 'Label'; newElem.size = 15; newElem.readOnly = true; newElem.value = Resource[lang].Theme; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_subject'; newElem.name = 'mail_subject'; newElem.type = 'text'; newElem.className = 'Field'; newElem.size = 30; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('textarea'); newElem.id = 'mail_msg'; newElem.name = 'mail_msg'; newElem.className = 'mailArea'; newElem.cols = 60; newElem.rows = 10; Td.appendChild(newElem); var newElem = document.createElement('span'); newElem.id = 'InsMessage'; newElem.style.color = 'Red'; newElem.style.visibility = 'hidden'; newElem.appendChild(document.createTextNode('*')); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_file'; newElem.name = 'mail_file'; newElem.type = 'file'; newElem.className = 'Field'; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'doSend'; newElem.name = 'doSend'; newElem.type = 'button'; newElem.className = 'sendForm'; newElem.value = Resource[lang].Send; newElem.onclick = btnClick; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'sendClear'; newElem.type = 'button'; newElem.className = 'sendForm'; newElem.value = Resource[lang].Clear; newElem.onclick = clearArea; Td.appendChild(newElem); Row.appendChild(Td); TBody.appendChild(Row); Table.appendChild(TBody); TForm.appendChild(Table); document.getElementById(basicID).appendChild(TForm); } function clearArea() { document.getElementById('mail_msg').innerHTML = ''; } function btnClick() { var msg = document.getElementById('mail_msg').value; if (msg == '') document.getElementById('InsMessage').style.visibility = 'visible'; else if (document.getElementById('InsMessage').style.visibility == 'visible') document.getElementById('InsMessage').style.visibility = 'hidden'; if (msg != '') { this.form.submit(); } } Форма обрабатывается следующим стандартным PHP скриптом simple_mail.php: <?php $picture = ""; // Если поле выбора вложения не пустое - закачиваем его на сервер if (!empty($_FILES['mail_file']['tmp_name'])) { // Закачиваем файл $path = $_FILES['mail_file']['name']; if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path; if ($_FILES['size'] > 2000000) copy($_FILES['mail_file']['tmp_name'], 'uploads/'.$path); } $thm = $_POST['mail_subject']; $msg = $_POST['mail_msg']; $mail_to = 'u1@localhost'; // Отправляем почтовое сообщение if (empty($picture)) mail($mail_to, $thm, $msg); else send_mail($mail_to, $thm, $msg, $picture); // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon) function send_mail($mail_to, $thema, $html, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { print "Cannot open file"; exit(); } $file = fread($fp, filesize($path)); fclose($fp); } $name = $path; $EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём $boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных. $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $headers .= "From: user@myhost"; $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=windows-1251$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; // раздел между заголовками и телом html-части $multipart .= chunk_split(base64_encode($html)); $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL"; $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($file)); $multipart .= "$EOL--$boundary--$EOL"; if (!mail($mail_to, $thema, $multipart, $headers)) {return False; //если не письмо не отправлено } else { //// если письмо отправлено return True; } exit; } ?>
А добавляется ли для формы enctype="multipart/form-data" ??? Обычно, если $_FILES пуст, проблема именно в этом.
Добавляется. Иначе и в Firefox были бы проблемы. Еще один момент, $_POST['mail_file'] содержит путь к файлу, хотя не должна. Та же самая форма, но не созданная динамически ведет себя иначе, т.е наоборот $_POST['mail_file'] - пустая, а массив $_FILES создается. Эта проблема существует именно для IE8, а может быть и для других версий IE. Что-то не так с JavaScript ... ?
Парни, я бы на вашем месте принципиально не отвечал в топике, пока автор не оформит код тегами. Пока он игнорирует это - нет элементарного уважения к людям которые будут читать его спагетти.
Поясняю особо одаренным. Видите такие кнопочки над полем для ввода сообщения? На них еще написано PHP, SQL, HTML, JS, CSS Так вот эти кнопочки служат для того, чтобы синтаксис кода был правильно подсвечен и читать его станет намного проще. Так понятно?
тегами JS. Видишь, над формой для ответа есть такие кнопочки - JS, PHP и так далее. Как ты думаешь, зачем они? Непонятно почему ты решил, что кто-то будет читать четыре листа кода черными буквами на сером фоне ради того чтобы тебе помочь.
В IE8 (IE6 и IE7 не проверял) не создается массив $_FILES и соответственно не получается отправить вложение, хотя в Firefox и Google Chrome все работает отлично. Эта проблема возникает только при динамическом создании формы отправки электронной почты. Помогите найти ошибку ! При выборе пункта меню "Контакты" вызывается следующая JavaScript функция для создания формы отправки электронной почты: [js]function Contacts(basicID, lang) { var TForm = document.createElement('form'); TForm.action = 'simple_mail.php'; TForm.enctype = 'multipart/form-data'; TForm.method = 'post'; TForm.target = 'mail_frame'; var Table = document.createElement('table'); Table.cellspacing = 0; Table.cellpadding = 0; Table.style.width = '100%'; var TBody = document.createElement('tbody'); var Row = document.createElement('tr'); var Td = document.createElement('td'); Td.style.border = 'solid 1px Gray'; Td.style.padding = '10px 10px 10px 10px'; var P = document.createElement('p'); P.id = 'TitleForm'; P.className = 'TitleForm'; P.appendChild(document.createTextNode(Resource[lang].Welcome)); Td.appendChild(P); var newElem = document.createElement('input'); newElem.id = 'labelEmail'; newElem.type = 'text'; newElem.className = 'Label'; newElem.size = 15; newElem.readOnly = true; newElem.value = Resource[lang].Email; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_from'; newElem.name = 'mail_from'; newElem.type = 'text'; newElem.className = 'Field'; newElem.size = 30; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'labelTheme'; newElem.type = 'text'; newElem.className = 'Label'; newElem.size = 15; newElem.readOnly = true; newElem.value = Resource[lang].Theme; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_subject'; newElem.name = 'mail_subject'; newElem.type = 'text'; newElem.className = 'Field'; newElem.size = 30; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('textarea'); newElem.id = 'mail_msg'; newElem.name = 'mail_msg'; newElem.className = 'mailArea'; newElem.cols = 60; newElem.rows = 10; Td.appendChild(newElem); var newElem = document.createElement('span'); newElem.id = 'InsMessage'; newElem.style.color = 'Red'; newElem.style.visibility = 'hidden'; newElem.appendChild(document.createTextNode('*')); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'mail_file'; newElem.name = 'mail_file'; newElem.type = 'file'; newElem.className = 'Field'; Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('br'); Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'doSend'; newElem.name = 'doSend'; newElem.type = 'button'; newElem.className = 'sendForm'; newElem.value = Resource[lang].Send; newElem.onclick = btnClick; Td.appendChild(newElem); var newElem = document.createElement('input'); newElem.id = 'sendClear'; newElem.type = 'button'; newElem.className = 'sendForm'; newElem.value = Resource[lang].Clear; newElem.onclick = clearArea; Td.appendChild(newElem); Row.appendChild(Td); TBody.appendChild(Row); Table.appendChild(TBody); TForm.appendChild(Table); document.getElementById(basicID).appendChild(TForm); } function clearArea() { document.getElementById('mail_msg').innerHTML = ''; } function btnClick() { var msg = document.getElementById('mail_msg').value; if (msg == '') document.getElementById('InsMessage').style.visibility = 'visible'; else if (document.getElementById('InsMessage').style.visibility == 'visible') document.getElementById('InsMessage').style.visibility = 'hidden'; if (msg != '') { this.form.submit(); } } [/js] Форма обрабатывается следующим стандартным PHP скриптом simple_mail.php: PHP: <?php $picture = ""; // Если поле выбора вложения не пустое - закачиваем его на сервер if (!empty($_FILES['mail_file']['tmp_name'])) { // Закачиваем файл $path = $_FILES['mail_file']['name']; if (copy($_FILES['mail_file']['tmp_name'], $path)) $picture = $path; if ($_FILES['size'] > 2000000) copy($_FILES['mail_file']['tmp_name'], 'uploads/'.$path); } $thm = $_POST['mail_subject']; $msg = $_POST['mail_msg']; $mail_to = 'u1@localhost'; // Отправляем почтовое сообщение if (empty($picture)) mail($mail_to, $thm, $msg); else send_mail($mail_to, $thm, $msg, $picture); // Вспомогательная функция для отправки почтового сообщения с вложением (Trianon) function send_mail($mail_to, $thema, $html, $path) { if ($path) { $fp = fopen($path,"rb"); if (!$fp) { print "Cannot open file"; exit(); } $file = fread($fp, filesize($path)); fclose($fp); } $name = $path; $EOL = "\r\n"; // ограничитель строк, некоторые почтовые сервера требуют \n - подобрать опытным путём $boundary = "--".md5(uniqid(time())); // любая строка, которой не будет ниже в потоке данных. $headers = "MIME-Version: 1.0;$EOL"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"$EOL"; $headers .= "From: user@myhost"; $multipart = "--$boundary$EOL"; $multipart .= "Content-Type: text/html; charset=windows-1251$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= $EOL; // раздел между заголовками и телом html-части $multipart .= chunk_split(base64_encode($html)); $multipart .= "$EOL--$boundary$EOL"; $multipart .= "Content-Type: application/octet-stream; name=\"$name\"$EOL"; $multipart .= "Content-Transfer-Encoding: base64$EOL"; $multipart .= "Content-Disposition: attachment; filename=\"$name\"$EOL"; $multipart .= $EOL; // раздел между заголовками и телом прикрепленного файла $multipart .= chunk_split(base64_encode($file)); $multipart .= "$EOL--$boundary--$EOL"; if (!mail($mail_to, $thema, $multipart, $headers)) {return False; //если не письмо не отправлено } else { //// если письмо отправлено return True; } exit; } ?>
My001 Мне все же кажется, что Ie не добавляет enctype к форме. Собственно, если exit(print_r($_FILES)) после отправки пуст, то надо курить ман JS и поиск аналогичных ошибок в гугле.
1. Проблемы с [js]this.form.submit()[/js] Вроде как и работает, но теряет контекст и вываливается в ошибку в некоторых случаях. Поэтому лучше [js]function btnClick() { document.getElementById('Sample').submit(); } [/js] 2.Вот так работает [js]function Contacts(val1, val2) { var target = document.getElementById(val1); target.innerHTML="<form enctype='multipart/form-data' action='s.php' method='post' id='Sample'><input type='file' name='samplefile'><input type='button' onclick='btnClick()' value='Send'>"; } [/js] Проблема именно в динамическом создании формы твоим способом. А если бы точнее - добавлении одного конкретного элемента Код (Text): <input type="file"> В чем там конкретно причина - может что-то недозадал, а может глюк IE - разбирайся сам
да точно - встречал ... когда создаешь элементы через ДОМ - то евенты (onmouseover, onclick) неработают
Все там работает. Просто уже зарегистрированные обработчики надо регистрировать для новых элементов вручную [js]elem.onclick = clickhandler[/js] У ТС проблема в другом. Форма "не понимает" что <input type="file"> принадлежит ей. Возможно просто что-то не дозадается (по аналогии с ручной регистрацией обработчиков), но есть ненулевая вероятность что это глюк/фича IE.
Методом научного тыка получилось. Для IE объект form надо добавлять вместе со свойствами: [js]if (isIE) var TForm = document.createElement( '<form action="simple_mail.php" enctype="multipart/form-data" method="post" target="mail_frame">'); else { var TForm = document.createElement('form'); TForm.action = 'simple_mail.php'; TForm.enctype = 'multipart/form-data'; TForm.method = 'post'; TForm.target = 'mail_frame';}[/js] Так работает. Очень хочется разобраться почему именно так ?
Это понятно. Почему обязательно добавлять вместе со свойствами именно объект form ? Интересно, где эта особенность IE описана.
Причем я вспомнил, воевал я когда-то с похожим. Это тянется давно, в 6, и 7ке тоже самое было. Но тогда я забил и решил через innerHTML.
А вот добавить form с помощью innerHTML у меня не получается ни со свойствами, ни без свойств. Проверочный скрипт ее не находит.
В div добавляй (или любой контейнер) HTML: <div id="target"></div> [js]document.getElementById('target').innerHTML = '';[/js]