В HTML-файле форма:
<form id="fetchForm">
<input type="file" name="originalImage" />
<input type="text" name="text" value="Photo explanatory text" />
</form>
<button onclick="handleForm();">HANDLE FORM</button>
Функция JS отправляет форму методом fetch и предполагает получение ответных данных в json о результате обработки:
function handleForm() {
let form = document.getElementById('fetchForm');
let fetchFormData = new FormData(form);
fetch('http://proba.loc/image-upload-action.php', {
method: 'POST',
body: fetchFormData,
})
.then(res => {
if (res.ok) {
return res.json();
} else {
console.error('Error in fetch request')
}
})
.then(data => {
console.log(data);
})
.catch(error => {
console.log(error)
})
}
PHP-обработчик формы выполняет ресайз изображения, сохраняет измененный файл изображения и должен отправить в ответ данные о результате: массив $result закодированный в формат json.
$result = [];
$result['status'] = 'error';
if (isset($_POST['text']) && $_POST['text'] != '' && isset($_FILES['originalImage'])) {
$fileExtensionsAllowed = ['jpeg', 'jpg', 'png', 'webp'];
$extension = pathinfo($_FILES['originalImage']['name'], PATHINFO_EXTENSION);
if (in_array($extension, $fileExtensionsAllowed)) {
$sourceFile = $_FILES['originalImage']['tmp_name'];
$newName = time() . '_' . uniqid() . '.' . $extension;
$destinationFile = 'images/' . $newName;
if ($extension == 'jpg' || $extension == 'jpeg') {
resizeImageJpeg($sourceFile, $destinationFile, 500, 500, 75, false);
$result['status'] = 'success';
$result['text'] = $_POST['text'];
$result['extension'] = $extension;
$result['newname'] = $newName;
}
} else {
$result['status'] = 'error';
$result['text'] = 'ERROR IN FILE EXTENSION';
}
} else {
$result['status'] = 'error';
$result['text'] = 'POST TEXT NOT SEND';
}
header('Content-Type: application/json');
$resultJson = json_encode($result);
echo $resultJson;
exit();
Функция resizeImageJpeg нормально работает, ресайз и сохранение измененного файла выполняются правильно.
Но ответные данные в формате json при этом не возвращаются в форму.
Возникает ошибка:
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data.
Причем, если закомментировать функцию resizeImageJpeg, то нормально возвращаются именно те данные, которые заданы после ее выполнения.
Т.е. каким-то образом именно выполнение функции ресайза "мешает" возврату данных. Получается или одно, или другое.
В чем дефект, и как исправить: и сделать ресайз и вернуть данные?
Виноват, опечатка, не показал resizeImageJpeg. Показываю:
function resizeImageJpeg($sourceFile, $destinationFile, $width, $height, $quality, $crop = false) {
list($currentWidth, $currentHeight) = getimagesize($sourceFile);
$rate = $currentWidth / $currentHeight;
if ($crop) {
if ($currentWidth > $currentHeight) {
$currentWidth = ceil($currentWidth - ($currentWidth * abs($rate-$width / $height)));
} else {
$currentHeight = ceil($currentHeight-($currentHeight * abs($rate-$width / $height)));
}
$newwidth = $width;
$newheight = $height;
} else {
if ($width/$height > $rate) {
$newwidth = $height * $rate;
$newheight = $height;
} else {
$newheight = $width / $rate;
$newwidth = $width;
}
}
$srcFile = imagecreatefromjpeg($sourceFile);
$dstFile = imagecreatetruecolor($newwidth, $newheight);
imagecopyresampled($dstFile, $srcFile, 0, 0, 0, 0, $newwidth, $newheight, $currentWidth, $currentHeight);
imagejpeg($dstFile, $destinationFile, $quality);
}
Дополнение по ответу сервера (скриншот):