Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.12.2018, 15:34
Аспирант
Отправить личное сообщение для TheSanches Посмотреть профиль Найти все сообщения от TheSanches
 
Регистрация: 21.01.2018
Сообщений: 78

Помогите прикрутить отправку файла к форме
Доброго времени суток, есть форма отправки писем, хочу сделать чтобы можно было еще и файл отправить, к примеру картинку, которая потом приходит вместе с письмом на почту.

Но не как не могу понять как это сделать, вложенный файл не приходит и все, есть подозрения что я не вытягиваю файл через 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");
}
?>
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2018, 15:53
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

contentType: false, //обязательно
processData: false, //обязательно
data: new FormData(this)
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2018, 16:04
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от TheSanches
if ($_FILES){
    $file = $_FILES['filename']['name'];
    move_uploaded_file($_FILES['filename']['tmp_name'], $file);
}
Так ни в коем случае делать нельзя, это во-первых дыра, во-вторых куда вы его пытаетесь залить и зачем?.
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2018, 16:30
Аспирант
Отправить личное сообщение для TheSanches Посмотреть профиль Найти все сообщения от TheSanches
 
Регистрация: 21.01.2018
Сообщений: 78

Я пытаясь с формы отправить сразу на почту, php я совсем поверхностно знаю, если можно поподробнее объясните мне что я должен сделать, спасибо.
Ответить с цитированием
  #5 (permalink)  
Старый 13.12.2018, 16:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Параметры запроса должны быть:
$.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\""; - это тема письма у вас, а на нее не действует объявленная кодировка письма, тему нужно кодировать (также найдете в сети, там просто).

Последний раз редактировалось laimas, 13.12.2018 в 17:04.
Ответить с цитированием
  #6 (permalink)  
Старый 13.12.2018, 17:03
Аспирант
Отправить личное сообщение для TheSanches Посмотреть профиль Найти все сообщения от TheSanches
 
Регистрация: 21.01.2018
Сообщений: 78

Большое спасибо.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли в этой форме прикрутить загрузку картинок? drkrol Общие вопросы Javascript 11 13.09.2015 17:28
Помогите найди ошибку в форме регистрации IONEX jQuery 6 20.08.2015 18:25
FileAPI - отправка файла в форме Veterinar jQuery 0 19.01.2014 23:07
Помогите формат данных привести к форме 0.00 руб. Aidar Общие вопросы Javascript 6 31.10.2013 22:13
Помогите: Вызов окна сохранения файла greatilya Общие вопросы Javascript 2 01.08.2008 14:56