Помогите прикрутить отправку файла к форме
Доброго времени суток, есть форма отправки писем, хочу сделать чтобы можно было еще и файл отправить, к примеру картинку, которая потом приходит вместе с письмом на почту.
Но не как не могу понять как это сделать, вложенный файл не приходит и все, есть подозрения что я не вытягиваю файл через ajax, но это только догадки. Если кто разбирается, прошу помощи. Код ниже... <form id="form" class="form" autocomplete="off" enctype='multipart/form-data'> <div class="feedback__input"> <p><input type="text" name="name" placeholder="Введите ваше имя" required></p> <p><input type="email" name="email" maxlength="25" placeholder="Введите ваш email" required></p> <p><input type="text" name="phone" placeholder="Введите ваш телефон" class="phone"></input></p> <p><textarea name="textarea" placeholder="Введите ваше сообщение" required></textarea></p> <p><input type="file" name="file" class="file"></input></p> </div> <div class="feedback__sent"> <p>Ваше сообщение успешно отправлено</p> </div> <div class="feedback__error"> <p>Произошла ошибка<br>сообщение не отправлено</p> </div> <div class="feedback__captcha"> <input id='knopochka' type="checkbox" name="knopochka" class="feedback__checkbox"> <label for='knopochka'><span>Я не робот</span></label> </div> <div class="feedback__btn"> <button class="btn" disabled>Отправить</button> </div> </form> $(document).ready(function() { var feedback = $('.feedback'); var feedback__checkbox = $('.feedback__checkbox'); var btn = document.querySelector('.btn'); /* Блокировка и разблокировка кнопки чекбокс */ feedback__checkbox.click(function(){ if( $(this).is(':checked') ) { btn.disabled = false; } else { btn.disabled = true; } }); /* Передача формы в обработчик */ $("#form").submit(function() { $.ajax({ type: "POST", url: "mail.php", data: $(this).serialize() }).done(function() { btn.disabled = true; $(this).find("input").val(""); $("#form").trigger("reset"); $('.feedback__sent').fadeIn(300).delay(4000).fadeOut(400); /* Плавное появление блока 3мс, задержка 4сек, плавное изчезновение блока 4мс */ }).fail(function(){ $("#form").trigger("reset"); $('.feedback__error').fadeIn(300).delay(3500).fadeOut(400); btn.disabled = true; }); return false; }); }); <?php /* Скрытая антиспам защита + антиспам чекбокс */ if ($_POST['phone']!='' || $_POST['knopochka']==false){ die(); } else{ $recepient = "dreadsite@ukr.net"; $sitename = "Dread.com.ua"; $name = trim($_POST["name"]); $email = trim($_POST["email"]); $text = trim($_POST["textarea"]); if ($_FILES){ $file = $_FILES['filename']['name']; move_uploaded_file($_FILES['filename']['tmp_name'], $file); } $message = "ИМЯ: $name \n\nE-MAIL: $email \n\nТЕКСТ:\n\n $text\n\n $file"; $pagetitle = "Новое сообщение с сайта \"$sitename\""; mail($recepient, $pagetitle, $message, "Content-type: text/plain; charset=utf-8 \r\n From: $recepient"); } ?> |
contentType: false, //обязательно processData: false, //обязательно data: new FormData(this) |
Цитата:
|
Я пытаясь с формы отправить сразу на почту, php я совсем поверхностно знаю, если можно поподробнее объясните мне что я должен сделать, спасибо.
|
Параметры запроса должны быть:
$.ajax({ type: "POST", url: "mail.php", contentType: false, processData: false, data: new FormData(this) }) //далее Перед тем как оперировать загруженным, нужно проверять ключ 'error' массива $_FILES, и если он равен 0, тогда файлом можно оперировать, то есть if(!$_FILES['file']['error']) { код дальнейшей проверки условий, если есть, и операции над файлом }. Файл может загрузиться и массив будет иметь информацию о нем, но при этом файл может быть загружен не полностью по какой либо причине, и $_FILES['error'] будет содержать номер этой ошибки. Поле выбора файла в форме имеет имя file, а в массиве $_FILES почему то ищется filename, а должно быть $_FILES['file']['tmp_name'] и т.п.. move_uploaded_file($_FILES['file']['tmp_name'], $file); - это означает, что файл будет загружен в текущую директорию, то есть ту в которой находится скрипт обработчик принимающий форму. Каталог, в котом находится исполняемые файлы ни в коем случае не должен иметь прав на запись по умолчанию. Если такая необходимость загружать в него файла, то перед загрузкой нужно дать такие права, а после загрузки вновь запретить (почитайте о CHMOD). Очень многое что приходит на сервер может быть подделано и $_FILES['file']['name'] в том числе. Если в этом поле будет путь, а не имя файла, а файл будет исполняемый, то его вам загрузят и запустят, последствия этого могут быть фатальными для сайта. Если используется имя оригинального файла, то обязательна операция basename($_FILES['file']['name']), а если загружается в каталог скриптов, то имя файла не используется вообще. Кроме этого, если для загрузки разрешены к примеру только файлы изображений, то такие файлы легко проверить на фейк. Если загруженный файл только для почтового отправления, то его не обязательно сохранять в директории сайта, он и так доступен на сервере как $_FILES['file']['tmp_name'], его и нужно прикреплять к почте. Но для этого почтовое отправление должно иметь иную структуру тела, нежели у вас. Поищите в сети "отправка почты с вложением", нет времени все разжевывать. $pagetitle = "Новое сообщение с сайта \"$sitename\""; - это тема письма у вас, а на нее не действует объявленная кодировка письма, тему нужно кодировать (также найдете в сети, там просто). |
Большое спасибо.
|
Часовой пояс GMT +3, время: 14:00. |