Загрузка файлов на сервер с помощью jQuery AJAX

Загрузка файлов на сервер с помощью jQuery AJAX

Как загружать файлы, например изображения, на сервер, используя AJAX и jQuery? Это делается достаточно просто! В этой статье мы подробно рассмотрим все шаги.

В прошлом, когда jQuery не существовал, или браузеры были не так развиты, загрузка файла на сайт с помощью AJAX могла быть сложной задачей: приходилось использовать различные ухищрения, такие как iframe. Но сейчас процесс загрузки файлов стал намного проще. Даже новичок в программировании сможет разобраться, что и куда вставлять. Эта статья поможет вам в этом. Если дополнить эти возможности функциями WordPress, безопасная обработка и загрузка файлов на сервер станет еще проще и интереснее (вы можете увидеть пример на WordPress в конце статьи).

Тем не менее, не забывайте, что вам понадобится хотя бы базовый опыт работы с файлами и знание Javascript, jQuery и PHP. Важно понимать, как происходит загрузка файлов на сервер и как работает AJAX.

Представленный ниже метод довольно стабильный и основывается на объекте Javascript new FormData(), который поддерживается во всех современных браузерах.

Чтобы лучше понять материал, мы разделим его на шаги. Итак, начнем...

Содержание:

  • Общий пример загрузки файлов с помощью AJAX
  • Шаг 1. Получаем данные из поля для файлов
  • Шаг 2. Создаем AJAX-запрос (по клику)
  • Шаг 3. Обрабатываем запрос: загружаем файлы на сервер
  • Пример загрузки файлов для WordPress

ОБЩИЙ ПРИМЕР ЗАГРУЗКИ ФАЙЛОВ С ПОМОЩЬЮ AJAX

Всё начинается с того, что на сайте должно быть поле ввода типа file. При этом это поле не обязательно должно быть частью формы (<form>).

Вот пример HTML-кода с полем для файлов и кнопкой "Загрузить файлы":


Загрузить файлы

ШАГ 1. ПОЛУЧАЕМ ДАННЫЕ ИЗ ПОЛЯ ДЛЯ ФАЙЛОВ

Первый шаг — получить данные о файлах, которые нужно загрузить.

При нажатии на поле для файлов открывается окно выбора, и после выбора данные о файлах сохраняются в этом поле. Нам нужно "забрать" их оттуда. Для этого мы привяжем функцию JavaScript к событию изменения, которая сохранит данные из поля для файлов в переменную files:

var files; // переменная будет содержать данные файла

// заполняем переменную данными при изменении значения поля
jQuery('input[type=file]').on('change', function(){
    files = this.files;
});

ШАГ 2. СОЗДАЁМ AJAX-ЗАПРОС (ПО КЛИКУ)

У нас есть данные о файлах, теперь нужно отправить их через AJAX. Мы привязываем это событие к клику на кнопку "Загрузить файлы".

В момент нажатия мы создаем новый объект new FormData() и добавляем данные из переменной files в него. Используя FormData(), мы можем быть уверены, что отправляемые данные выглядят так, как если бы мы просто отправили форму в браузере.

Затем мы создаем нестандартный AJAX-запрос, в котором передаем файлы в стандартном формате для сервера: $_FILES.

Для создания такого запроса в jQuery нам нужно установить дополнительные параметры, так что привычная функция $.post() здесь не подойдёт, и мы используем более гибкий вариант: $.ajax().

Два важных параметра нужно установить в значение false:

  • processData: отключает обработку передаваемых данных. По умолчанию jQuery собирает данные в строку запроса и добавляет её в URL. Для POST-запросов он выполняет другие преобразования. Изменение оригинальных данных может вызвать проблемы, поэтому мы отключаем эту опцию.

  • contentType: отключает установку заголовка типа запроса. По умолчанию jQuery устанавливает "application/x-www-form-urlencoded". Этот заголовок не позволяет загружать файлы. Если установить его в "multipart/form-data", PHP не сможет распознать переданные данные и выдаст предупреждение. Самый простой вариант — отключить эту опцию, и всё будет работать!

// обработка и отправка AJAX-запроса по клику на кнопку upload_files
jQuery('.upload_files').on('click', function(event){
    event.stopPropagation(); // останавливает все текущие JS события
    event.preventDefault();  // останавливает стандартное событие для текущего элемента

    // ничего не делаем, если переменная files пуста
    if (typeof files === 'undefined') return;

    // создаем объект FormData
    var data = new FormData();

    // заполняем объект данными файлов
    $.each(files, function(key, value){
        data.append(key, value);
    });

    // добавляем переменную для идентификации запроса
    data.append('my_file_upload', 1);

    // AJAX-запрос
    $.ajax({
        url: './submit.php',
        type: 'POST', // важно!
        data: data,
        cache: false,
        dataType: 'json',
        processData: false, // отключаем обработку переданных данных
        contentType: false, // отключаем установку заголовка типа запроса
        success: function(respond, status, jqXHR) {
            // если всё прошло успешно
            if (typeof respond.error === 'undefined') {
                // выводим пути загруженных файлов
                var files_path = respond.files;
                var html = '';
                $.each(files_path, function(key, val){
                    html += val + '
'; }); $('.ajax-reply').html(html); } else { console.log('ERROR: ' + respond.data); } }, error: function(jqXHR, status, errorThrown) { console.log('AJAX запрос ERROR: ' + status, jqXHR); } }); });

ШАГ 3. ОБРАБАТЫВАЕМ ЗАПРОС: ЗАГРУЖАЕМ ФАЙЛЫ НА СЕРВЕР

Теперь последний шаг: нам нужно обработать присланный запрос.

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

Создадим файл submit.php со следующим кодом (предполагается, что submit.php находится в той же папке, откуда отправляется AJAX-запрос):

 $done_files) : array('error' => 'Ошибка загрузки файла.');

    die(json_encode($data));
}

Это всё!

Важно! Этот код только демонстрирует, как получать и сохранять файлы. На самом деле, вам нужно проверить форматы загружаемых файлов, их размер, транслитерировать кириллические названия и, возможно, выполнять некоторые другие проверки.


ПРИМЕР ЗАГРУЗКИ ФАЙЛОВ ДЛЯ WORDPRESS

В WordPress обработка AJAX-запросов гораздо проще, потому что есть готовые функции, например, media_handle_upload().

Первые два шага аналогичны, а в третьем шаге мы используем встроенную функцию, которая добавляет файл в медиатеку и связывает его с текущим постом.

Чтобы код ниже работал, его нужно добавить в файл functions.php вашей темы. Затем создайте страницу с ЧПУ ajax_file_upload и перейдите на неё. В контенте вы увидите форму для добавления файла. Выберите файлы и проверьте, загружаются ли они...

post_name !== 'ajax_file_upload') return $text;

    return $text .= '
        
        
        
'; } // JS код function ajax_file_upload_jscode() { ?> $max_size || $sizedata[1] /*высота*/ > $max_size) wp_send_json_error(__('Изображение не может быть больше '. $max_size .' пикселей по ширине или высоте...','km')); // обрабатываем загрузку файла require_once ABSPATH . 'wp-admin/includes/image.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; // фильтруем допустимые типы файлов - разрешаем только изображения add_filter('upload_mimes', function($mimes) { return [ 'jpg|jpeg|jpe' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png', ]; }); $uploaded_imgs = array(); foreach ($_FILES as $file_id => $data) { $attach_id = media_handle_upload($file_id, $post_id); // ошибка if (is_wp_error($attach_id)) $uploaded_imgs[] = 'Ошибка при загрузке файла '. $data['name'] .': '. $attach_id->get_error_message(); else $uploaded_imgs[] = wp_get_attachment_url($attach_id); } wp_send_json_success($uploaded_imgs); }

Теперь вы имеете представление о том, как загружать файлы на сервер с использованием AJAX и jQuery в контексте WordPress. Следуйте приведенным шагам, и у вас все получится!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *