Я провожу парсинг JSON с использованием js и php но с сервера получаю ошибку что джсон пустой

function uploadXlsx(products) {
    console.log("Отправляем продукты:", products);


    const formData = new FormData();
    formData.append("json", JSON.stringify(products));


    fetch("import_excel.php", {
        method: "POST",
        body: formData
    })
        .then(response => response.text())
        .then(text => {
            console.log("Ответ сервера (сырой):", text);

            let result;
            try {
                result = JSON.parse(text);
            } catch (e) {
                console.error("Ошибка парсинга JSON:", e, text);
                alert("Сервер вернул некорректный JSON");
                return;
            }

            if (result.success) {
                alert(`Импорт завершён\nОбновлено: ${result.updated}\nСоздано: ${result.created}`);
            } else {
                alert(`Ошибка: ${result.error || "Неизвестная"}\n`);
                console.error(result);
            }
        })
        .catch(err => {
            console.error("Ошибка отправки:", err);
            alert("Ошибка при отправке запроса на сервер");
        });
}

Это js часть кода она принимает файл и в формате json отправляет массив в php

$raw = file_get_contents('php://input');
logmsg("Тело запроса (" . strlen($raw) . " байт)");

$data = null;

if (!empty($_POST['json'])) {
    $data = json_decode($_POST['json'], true);
    logmsg("Распарсен json из POST['json']");
} elseif (!empty($raw)) {
    $data = json_decode($raw, true);
    logmsg("Распарсен json из php://input");
}

if ($data === null || json_last_error() !== JSON_ERROR_NONE) {
    $err = json_last_error_msg();
    logmsg("Ошибка JSON: " . $err);
    echo json_encode(['success' => false, 'error' => 'Некорректный JSON: ' . $err]);
    exit;
}

if (isset($data[0]) && is_array($data[0])) {
    $data = ['products' => $data];
    logmsg("Обёрнуто в products");
}

if (empty($data['products']) || !is_array($data['products'])) {
    logmsg("Нет products или не массив");
    echo json_encode(['success' => false, 'error' => "Поле 'products' отсутствует или неверного формата"]);
    exit;
}

Обработка массива в php здесь куча проверок и все без толку с сервера приходит что был отправлен пустой массив и что отсутствуют products хотя в эксель файле они есть


Ответы (1 шт):

Автор решения: Виктор Карев

Подозреваю, что когда данные отправляются с помощью FormData, то тип содержимого будет multipart/form-data. А php://input с таким типом содержимого недоступен. Делайте проще:

fetch("import_excel.php", {
        method: "POST",
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(products)
    })
→ Ссылка