Я провожу парсинг 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)
})