За последние 24 часа нас посетили 23857 программистов и 1722 робота. Сейчас ищут 1772 программиста ...

Отправка нескольких файлов Ajax

Тема в разделе "JavaScript и AJAX", создана пользователем karmay, 14 май 2018.

  1. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Всем привет, очень нужна помощь. Суть вопроса такова, есть форма обратной связи, к ней можно прикрепить файл, мне этот файл необходимо на почту отправить, и все это без перезагрузки страницы.
    Мои знания jQuery на уровне $('#id').click(function(){}); и все
    Код (Javascript):
    1. // нагуглил скрипт
    2. (function($){
    3. var files;
    4. $('input[type=file]').change(function(){
    5.     files = this.files;
    6. });
    7. // типа тут мы складываем данные из поля в переменную
    8. // следующим шагом по клику создаем объект
    9. $("#form_btn").click(function(event){
    10. var data = new FormData();
    11. // вот тут мне непонятно
    12.     $.each( files, function( key, value ){
    13.         data.append( key, value );
    14.     });
    15. // и отправляем запрос
    16. $.ajax({
    17.      url: './submit.php',
    18.      type: 'POST',
    19.      data: data,
    20.      cache: false,
    21.      dataType: 'json',
    22.      processData: false, // Не обрабатываем файлы (Don't process the files)
    23.      contentType: false, // Так jQuery скажет серверу что это строковой запрос
    24.      success: function( respond, textStatus, jqXHR ){
    25.        // Если все ОК
    26.        if( typeof respond.error === 'undefined' ){
    27.          // Файлы успешно загружены, делаем что нибудь здесь
    28.  
    29.          // выведем пути к загруженным файлам в блок '.ajax-respond'
    30.          var files_path = respond.files;
    31.          var html = '';
    32.          $.each( files_path, function( key, val ){ html += val +'<br>'; } )
    33.          $('.ajax-respond').html( html );
    34.        }
    35.        else{
    36.          console.log('ОШИБКИ ОТВЕТА сервера: ' + respond.error );
    37.        }
    38.      },
    39.      error: function( jqXHR, textStatus, errorThrown ){
    40.        console.log('ОШИБКИ AJAX запроса: ' + textStatus );
    41.      }
    42.    });
    43.  
    44. });
    у меня сложность заключается в том, что нет понимания как эта хрень работает, нужна помощь именно объяснить некоторые моменты.
    - помочь раскурить FormData
    - как в этот объект складываются картинки и как туда положить массив картинок
    - в success тут вообще мне ничего непонятно, как тут выводить результат работы submit.php
    т.е. как сложить несколько картинок в объект, отправить его и в каком виде они туда придут, и как ответ отправляется
    за помощь готов угостить пивом ))
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто погляди пример, где в формдату пихается файл из инпута
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Много лишнего в коде. Всё можно сделать гораздо проще:
    Код (Javascript):
    1. $(function() {
    2.   $('form_selector').on('submit', function(e) {
    3.     e.preventDefault();
    4.     const formData = new FormData(this); // все данные формы в FormData
    5.     $.ajax({
    6.       // другие опции
    7.       data: formData
    8.     });
    9.   });
    10. });
    Для загрузки нескольких файлов, не забываем имя файлового поля записать, как массив
    HTML:
    1. <input type="file" name="files[]" multiple>
    --- Добавлено ---
    Зависит от формата данных, которые вы возвращаете на Ajax-запрос.
     
    karmay и MouseZver нравится это.
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.331
    Адрес:
    Лень
    Код (Javascript):
    1. .on( 'submit', 'form', function ( e )
    2.     {
    3.         e.preventDefault();
    4.        
    5.         var obj = new FormData( $( this ).get(0) );
    6.        
    7.         $.ajax(
    8.         {
    9.             url: $( this ).attr( 'action' ),
    10.             type: $( this ).attr( 'method' ),
    11.             contentType: false,
    12.             processData: false,
    13.             data: obj,
    14.             dataType: 'JSON',
    15.             success: function ( json )
    16.             {
    17.                 //
    18.             }
    19.         });
    20.     });
     
    karmay нравится это.
  5. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    Вот, кстати, это ресурс мне попадался, но я на него только посмотрел, смутила переменна $that. А вот что там есть еще пару уроков по основам я не заметил, вот их сейчас и начну. Мож к утру че-нить получится.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в $that обычно пихают this, чтобы использовать её там, где есть другой this
     
  7. karmay

    karmay Активный пользователь

    С нами с:
    9 ноя 2017
    Сообщения:
    180
    Симпатии:
    18
    Адрес:
    Н.Новгород
    я просто впервые встрелил это, и было непонятно, а на самом деле ресурс зачет.
    Столько разных вариантов прошлой ночью пробовал, это ужас, и теперь я понимаю, почему они не работали. Конечно, еще есть о чем почитать, но в целом все встало на свои места. Делаю сайт для типографии, и там нужна загрузка файлов большого размера, столкнулся с проблемой размера, вроде как решил через .htaccess, надо еще прелоадер делать, векторная графика долго грузится. но это уже совсем другая история, всем сапсибо.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    смотри, а то так сильно умным станешь.