Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.04.2018, 06:33
Кандидат Javascript-наук
Отправить личное сообщение для rafaello Посмотреть профиль Найти все сообщения от rafaello
 
Регистрация: 09.11.2012
Сообщений: 103

Передать multipart/form-data через ajax
Здравствуйте! Прошу оказать помощь в решении вопроса.
Имеется форма смешанного содержимого
<form name='adminForm' id='adminForm' class='' enctype='multipart/form-data'  method='post' action='add.php'>
<input type="text" class="input-icon input-icon_email required" name="f_Email" placeholder="Email или Телефон">
<textarea class="input-icon input-icon_text required" name="f_Text" placeholder="Текст вашего сообщения "></textarea>
<input type="file" name="f_file" class="js-styler" data-placeholder="Прикрепите файл (размер до 10 мб)." data-browse="Выберите файл">
<button type="submit" id="checkvild" class="btn form-btn"><span>Отправить</span></button>
</form>

При обычной отправке на адрес add.php все работает, то есть обработчик принимает пост запрос, обрабатывает и сохраняет в базу все данные и картинки.
В связи с изменением дизайна необходимо сделать без перезагрузки, через ajax, post
Пробовал вот так
$('#adminForm').each(function() {
$form.validate({
submitHandler: function(form) {
$.ajax({
                   type: "POST",
                   url: "/netcat/add.php",
                   contentType: 'multipart/form-data',
                   data: $(form).serialize(),
                   processData: false,
                   contentType: false
                                  }).done(function() {
                                  form.reset();
                                  $form.next('.js-form-success').show();
                }); } }); });

и так
$('#adminForm').each(function() {
$form.validate({
submitHandler: function(form) {
$.ajax({
                   type: "POST",
                   url: "/netcat/add.php",
                   contentType: 'multipart/form-data',
                   data: new FormData($(form)),
                   processData: false,
                   contentType: false
                                  }).done(function() {
                                  form.reset();
                                  $form.next('.js-form-success').show();
                }); } }); });

не получается в обоих случаях.
$form.next('.js-form-success').show(); выполняется, но POST запрос в базу данных не сохраняется.

Последний раз редактировалось rafaello, 19.04.2018 в 06:37.
Ответить с цитированием
  #2 (permalink)  
Старый 19.04.2018, 07:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от rafaello
$('#adminForm').each(function() {
А это зачем?
Ответить с цитированием
  #3 (permalink)  
Старый 19.04.2018, 08:10
Кандидат Javascript-наук
Отправить личное сообщение для rafaello Посмотреть профиль Найти все сообщения от rafaello
 
Регистрация: 09.11.2012
Сообщений: 103

Это так написал тот человек, который делал новый дизайн.
$('#adminForm').each(function() {
	$form.validate({
//....
//.... здесь идет код проверки валидации формы на заполненность полей
//....
	submitHandler: function(form) {
$.ajax({
	                   type: "POST",
	                   url: "/netcat/add.php",
	                   contentType: 'multipart/form-data',
	                   data: $(form).serialize(),
	                   processData: false,
	                   contentType: false
	                                  }).done(function() {
	                                  form.reset();
	                                  $form.next('.js-form-success').show();
	                }); } }); });
Ответить с цитированием
  #4 (permalink)  
Старый 19.04.2018, 08:13
Кандидат Javascript-наук
Отправить личное сообщение для rafaello Посмотреть профиль Найти все сообщения от rafaello
 
Регистрация: 09.11.2012
Сообщений: 103

то есть он писал код для обычной формы, без полей типа файл. И обычная форма работает. А при добавлении поля типа файл - не работает.
Ответить с цитированием
  #5 (permalink)  
Старый 19.04.2018, 08:18
Кандидат Javascript-наук
Отправить личное сообщение для rafaello Посмотреть профиль Найти все сообщения от rafaello
 
Регистрация: 09.11.2012
Сообщений: 103

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

Сообщение от rafaello
$('#adminForm').each(function() {
Это для одной формы с уникальным ID полнейшая глупость. Обрабатывать нужно событие onsubmit, в котором отменять действие по умолчанию, а данные отправляемые формой, это будет new FormData(this). Ни кто не будет сериализовать бинарные данные.

Сообщение от rafaello
то есть обработчик принимает пост запрос, обрабатывает и сохраняет в базу все данные и картинки.
И изображения в базу?
Ответить с цитированием
  #7 (permalink)  
Старый 19.04.2018, 08:44
Кандидат Javascript-наук
Отправить личное сообщение для rafaello Посмотреть профиль Найти все сообщения от rafaello
 
Регистрация: 09.11.2012
Сообщений: 103

получается у меня есть два типа форм, одни без типа файл, другие с типом файл. Для одних один id для други другой id.
Если я правильно понял, надо прописать действие onsubmit , верно?
.... а на ваш вопрос по поводу картинок - обработчик, если напрямую отправлять, без jquery, то он выдает ссылку на сохраненный файл
Ответить с цитированием
  #8 (permalink)  
Старый 19.04.2018, 11:00
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,814

Сообщение от laimas
Это для одной формы с уникальным ID полнейшая глупость.
Иногда подобное бывает очень удобным, не нужно сохранять ссылку на элемент, чтобы с ним взаимодействовать.

rafaello, так пробовали?
$('#adminForm').each(function() {
    $form.validate({
        submitHandler: function(form) {
            $.ajax({
                type: "POST",
                url: "/netcat/add.php",
                data: new FormData(form),
                processData: false,
                contentType: false
            }).done(function() {
                form.reset();
                $form.next('.js-form-success').show();
            });
        }
    });
});

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

Сообщение от Nexus
contentType: 'multipart/form-data'
processData: false,
contentType: false

Иначе тип не не будет соответствующим.
Ответить с цитированием
  #10 (permalink)  
Старый 19.04.2018, 13:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от rafaello
получается у меня есть два типа форм, одни без типа файл, другие с типом файл. Для одних один id для други другой id.
Ну допустим, а зачем?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать еще один параметр в ajax BesTime AJAX и COMET 2 12.03.2016 00:43
Как в обработчик php через Ajax передать несколько значений? Urukhay Общие вопросы Javascript 2 30.08.2014 16:19
как передать измененные параметры AJAX в другую функцию? akselei Элементы интерфейса 2 19.10.2013 12:46
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
Передача HTML кода на сервер через Ajax KomaLex AJAX и COMET 2 06.12.2012 15:28