Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.07.2018, 10:24
Аспирант
Отправить личное сообщение для SkyRewir Посмотреть профиль Найти все сообщения от SkyRewir
 
Регистрация: 07.06.2017
Сообщений: 47

Отдать файл на загрузку с помощью ajax
Добрый день, Форум!
Помогите пожалуйста найти ошибку в скрипте и по возможности её исправить

На сайте есть форма
<form action="PHP/email.php" method="POST" id="form1">
    <input type="text" name="name" placeholder="Ваше имя">
    <input type="phone" name="phone" placeholder="Ваш телефон">
    <input type="email" name="email" placeholder="Ваша почта">
    <button class="buttonIntroduction">Получить консультацию</button>
</form>

К форме сделан AJAX
$("#form1").submit(function(event){
		event.preventDefault();
		$.ajax({
			url: $(this).attr('action'),
			type: $(this).attr('method'),
			data: {
				file: true,
				new FormData(this)
			},
			contentType: false,
			cache: false,
			success: function(){
				$('#thanks').css('display', 'flex');
				setTimeout(function() {
					$("#modal").hide('slow'); 
					$('#thanks').css('display', 'none');
				}, 2000);	
			}
		});
	});

И php скрипт, который отправляет письмо на почту с данными формы и (должен отдать клиенту PDF документ на загрузку), но что-то идет не так и файл не отдаётся
<?php
	$name = trim($_POST['name']);
	$phone = trim($_POST['phone']);
	$email = trim($_POST['email']);
	$file = trim($_POST['file']);

	$to = "pavlov.d1994@inbox.ru";
	$subject = "Заявка с сайта";
	$subject = "=?UTF-8?B?".base64_encode($subject)."?=";
	$mail = "Пришла заявка с сайта Alicense.kz\n".
	"Имя клиента: $name\n".
	"Телефон для связи с клиентом: $phone\n".
	"Почта клиента: $email\n";
	"Перезвонить для уточнения деталей.";
	$headers = 'From: info@alicense.kz' . "\r\n" .
	'Reply-To: info@alicense.kz' . "\r\n" .
	'X-Mailer: PHP/' . phpversion();
	$send = mail($to, $subject, $mail, $headers);
	
	if ($file != FALSE) {
	    $file = $_SERVER['DOCUMENT_ROOT'].'/Content/Прайс_лист.pdf';
	    header('Content-Description: File Transfer');
	    header('Content-Type: application/octet-stream');
	    header('Content-Disposition: attachment; filename="'.basename($file).'"');
	    header('Expires: 0');
	    header('Cache-Control: must-revalidate');
	    header('Pragma: public');
	    header('Content-Length: ' . filesize($file));
	    readfile($file);
	}
?>

Страница в браузере не должна перезагружаться, а меня перекидывает на страницу со скриптом email.php и выдаёт ошибку "Notice: Undefined index: file", что переменная $file не определенна

Всем спасибо за ответы и помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 17.07.2018, 11:08
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

SkyRewir,
У вас здесь
data: {
				file: true,
				new FormData(this)
			},

получается неправильная структура данных.
Создайте предварительно переменную с new FormData(this) и добавьте к ней file: true
Работа с FormData
Ответить с цитированием
  #3 (permalink)  
Старый 17.07.2018, 11:36
Аспирант
Отправить личное сообщение для SkyRewir Посмотреть профиль Найти все сообщения от SkyRewir
 
Регистрация: 07.06.2017
Сообщений: 47

Я вас правильно понял?
var a = new FormData(this);
data: {
	a.append("file", "true");
}
Ответить с цитированием
  #4 (permalink)  
Старый 17.07.2018, 11:42
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

SkyRewir,
var a = new FormData(this);
 a.append("file", "true");
.........
.........
data: a,
Ответить с цитированием
  #5 (permalink)  
Старый 17.07.2018, 11:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

SkyRewir,
зачем вообще нужен ключ file, если файлы это $_FILES?
Если файл загружается только ради передачи его в письме, то загружать его в каталог, а затем забирать из него, это лишнее.
Метод $.ajax должен иметь следующие параметры:

contentType: false
processData: false

PS. А перенаправление и следовательно ошибка, это от логики скрипта.

Последний раз редактировалось laimas, 17.07.2018 в 11:48.
Ответить с цитированием
  #6 (permalink)  
Старый 17.07.2018, 12:32
Аспирант
Отправить личное сообщение для SkyRewir Посмотреть профиль Найти все сообщения от SkyRewir
 
Регистрация: 07.06.2017
Сообщений: 47

laimas,
Файл не передаётся в письме, он должен отдаться на загрузку клиенту в браузер после того как он оставит заявку

Получается следующее
$("#form1").submit(function(event){
		event.preventDefault();
		$.ajax({
			var a = new FormData(this);
			a.append("file", "true");
			url: $(this).attr('action'),
			type: $(this).attr('method'),
			processData: false,
			data: a,
			contentType: false,
			cache: false,
			success: function(){
				$('#thanks').css('display', 'flex');
				setTimeout(function() {
					$("#modal").hide('slow'); 
					$('#thanks').css('display', 'none');
				}, 2000);	
			}
		});
});


В email.php скрипте я ловлю
$name = trim($_POST['name']);
$phone = trim($_POST['phone']);
$email = trim($_POST['email']);
$file = trim($_POST['file']);


Но переменная $file снова не определена

Последний раз редактировалось SkyRewir, 17.07.2018 в 12:39.
Ответить с цитированием
  #7 (permalink)  
Старый 17.07.2018, 12:36
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от SkyRewir
Файл не передаётся в письме
Это логично.

Сообщение от SkyRewir
он должен отдаться на загрузку клиенту в браузер
А это каким образом с учетом того, что запрос клиента асинхронный? Вы свой скрипт проанализируйте - что отправляет клиент и что он ожидает в ответ.
Ответить с цитированием
  #8 (permalink)  
Старый 17.07.2018, 12:39
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

SkyRewir,
Это
var a = new FormData(this);
			a.append("file", "true");

поставить перед $.ajax({
Ответить с цитированием
  #9 (permalink)  
Старый 17.07.2018, 12:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Dilettante_Pro,
оно вообще как собаке пятая лапа.
Сама логика скрипта серверного вообще не в тему, и "примочки file" ситуацию не спасут.
Ответить с цитированием
  #10 (permalink)  
Старый 17.07.2018, 13:15
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

я так понимаю, при сабмите формы должно произойти 2 действия
1) отправка почты
2) скачивание файла в браузер

Тогда надо сделать вот что:

на форму добавить <input type="hidden" name="file" value="true">

в обработчике submit сделать только проверку пользовательского ввода - что указан корректный емайл, телефон и т.д. Если что-то некорректное, то вызвать event.preventDefault();, иначе не вызывать.

без event.preventDefault(); форма просто засабмитится, но благодаря "Content-Disposition: attachment" будет просто скачивание файла. Т.е. аякс тут вообще нахрен не нужен
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка файла в массив строк с помощью AJAX malcomoffice AJAX и COMET 2 08.06.2010 18:02
Проверка наличия логина в БД при регистрации, с помощью ajax storng Общие вопросы Javascript 4 09.04.2010 20:24
Ajax c помощью prototype - что не так? Alive Substance Библиотеки/Тулкиты/Фреймворки 1 01.03.2010 16:51
Как в ajax запросе передать файл методом POST mcpro jQuery 1 16.12.2009 11:41
Заполнение таблицы с помощью AJAX x][x AJAX и COMET 11 08.05.2009 19:58