@SergioCoder

Как получить ответные данные в json после ресайза изображения на сервере?

В 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);
}


Дополнение по ответу сервера (скриншот):
658ad9df0da4d055937261.jpeg
  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ну вот, собственно, текст ошибки вы видите, смотрите в image-upload-action.php строки 55 и 56. Там у вас неявное преобразование из float в int, о чём и предупреждает PHP.
Могу предположить, что проблема в передаче параметров в imagecreatetruecolor и imagecopyresampled. По спецификации параметры целочисленные, а у вас вычисляются вещественные значения. Попробуйте так:
- $newwidth = $height * $rate;
+ $newwidth = round($height * $rate);
- $newheight = $width / $rate;
+ $newheight = round($width / $rate);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы