как отправлять массивы и файлы через formdata и ajax в php

Аватар пользователя Nikolai Gagarinov
Nikolai Gagarinov
26 февраля 2025

Отправка массивов и файлов через FormData и AJAX в PHP требует выполнения определённых шагов как на стороне клиента (JavaScript), так и на стороне сервера (PHP).

Сначала создадим HTML-форму, которая позволит нам выбирать файлы и вводить данные:

<form id="myForm">
    <input type="file" name="files[]" multiple />
    <input type="text" name="data[]" placeholder="Введите данные" />
    <input type="text" name="data[]" placeholder="Введите больше данных" />
    <button type="submit">Отправить</button>
</form>
<div id="response"></div>

Теперь реализуем отправку этой формы через AJAX. Мы будем использовать метод POST и XMLHttpRequest для передачи данных:

document.getElementById('myForm').addEventListener('submit', function (event) {
    event.preventDefault(); // Отменяем стандартное поведение формы

    // Создаем новый объект FormData
    var formData = new FormData(this);

    // Создаем новый XMLHttpRequest
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'upload.php', true);

    xhr.onload = function () {
        if (xhr.status === 200) {
            // Обработка успешного ответа
            document.getElementById('response').innerHTML = xhr.responseText;
        } else {
            // Обработка ошибок
            document.getElementById('response').innerHTML = 'Ошибка: ' + xhr.status;
        }
    };

    // Отправляем FormData
    xhr.send(formData);
});

Теперь создадим скрипт на сервере, который будет обрабатывать отправленные данные. PHP автоматически превращает данные в массивы, если имена полей содержат [].

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Обработка полученных текстовых данных
    $data = $_POST['data']; // Это будет массив данных

    // Обработка полученных файлов
    if (!empty($_FILES['files'])) {
        $files = $_FILES['files'];
        $fileCount = count($files['name']); // Количество загруженных файлов
    } else {
        // Файлы не были загружены
    }
} else {
    // Некорректный запрос
}

HTML-форма содержит поле для загрузки файлов и два текстовых поля. Атрибут multiple позволяет выбирать несколько файлов.

В JavaScript мы используем объект FormData, который удобно применять для создания наборов пар ключ-значение, содержащих как текстовые данные, так и файлы. XMLHttpRequest позволяет асинхронно отправлять данные на сервер.

На стороне PHP мы получаем данные, переданные из AJAX-запроса. Файлы находятся в массиве $_FILES, а текстовые данные можно взять из $_POST.

Используя метод FormData и AJAX, мы можем легко отправлять массивы и файлы на сервер и обрабатывать их с помощью PHP. Важно убедиться, что у нас есть соответствующие права на запись в папку, в которую мы загружаем файлы, и предусмотреть обработку ошибок на обоих концах, чтобы сделать приложение более устойчивым.

0 0