Задать вопрос
yaleksandr89
@yaleksandr89
PHP developer

Как решить данную задачу корректно?

Здравствуйте.
Наткнулся тут на задачку и не могу доделать небольшую проверку в конце. Сам текст задания:

Написать PHP скрипт, который загружает из интернета любое изображение на ваш выбор, в загруженном изображении копирует левую половину изображения, зеркально ее отражает и вставляет вместо правой половины изображения. Полученый результат должен быть сохранен в ту же папку, где лежит скрипт в формате png.


Сам скрипт выглядит так (выпилю из него html, что бы было покомпактнее)

<?php
            if (count($_POST) > 0 && isset($_POST['received_image'])) {
                $image_correct = false; // Если при загрузке изображения возникли проблемы, не показываем html разметку для изображений
                // Загружаем изображение на сервер
                $url = $_POST['received_image'];
                unset($_POST['received_image']);
                $image = file_get_contents($url);
                // Получаем расширение загружаемого файла для последующей проверки
                $explode_file = explode('.', $url);
                $extension_file = array_pop($explode_file);

                if ($extension_file == 'bmp' || $extension_file == 'gif' || $extension_file == 'jpg' || $extension_file == 'jpeg') {
                    $image_correct = true;
                    echo '<div class="alert alert-success" role="alert">Изображение загружено</div>';
                    $filename = preg_replace('"\.(bmp|gif|jpg|jpeg)$"', '.png', $url); // Заменяем расширение фала на *.png
                    $prefix = str_replace(['-', ' ', ':'], ['_', '-', '_'], date("Y-m-d H:i:s")); // Создаем префикс к файлу, что бы избежать перезаписи файла
                    $new_name = $prefix . basename($filename); // Формируем уникальное имя для файла
                    $new_name_original = 'ORIGINAL_' . $new_name; // Префикс для полученного изображения ДО обработки
                    file_put_contents($new_name_original, $image); // сохраняем полученный файл в папку, где лежит скрипт
                    $info = getimagesize($new_name_original);
                    // Выбираем тип изображения
                    switch ($info[2]) {
                        case 1:
                            $tmp = imageCreateFromGif($new_name_original);
                            break;
                        case 2:
                            $tmp = imageCreateFromJpeg($new_name_original);
                            break;
                        case 3:
                            $tmp = imageCreateFromPng($new_name_original);
                            break;
                    }
                    $width = $info[0];
                    $height = $info[1];
                    $prepared_image = $tmp;
                    // Получаем отзеркаленное по вертикали изображение
                    $crop_image = imagecrop($prepared_image, ['x' => 0, 'y' => 0, 'width' => $width / 2, 'height' => $height]);
                    imageflip($crop_image, IMG_FLIP_HORIZONTAL); // Отображаем зеркально
                    imagecopymerge($prepared_image, $crop_image, $width / 2, 0, 0, 0, $width, $height, 100);  // Объединяем изображения
                    // Сохраняем полученный результат в отдельный файл с префиксом 'PROCESSED'
                    $new_name_processed = 'PROCESSED_' . $new_name; // Префикс для полученного изображения ПОСЛЕ обработки
                    file_put_contents($new_name_processed, $image);
                    imagejpeg($prepared_image, $new_name_processed);
                    // очищаем память
                    imagedestroy($prepared_image);
                    imagedestroy($crop_image);
                } else {
                    echo '<div class="alert alert-danger" role="alert">Указанная ссылка имеет недопустимый формат. 
                    К загрузке разрешаются изображения с расширениями:  *.bmp, *.gif, *.jpg, *.jpeg.</div>';
                    unset($_POST['received_image']);
                }
            } elseif (count($_POST) > 0) {
                echo '<div class="alert alert-danger">Сбой при загрузке изображения</div>';
            }
            ?>



ну и тут все выводиться:
<?php if ($image_correct) : ?>
....
<?php endif; ?>


Все вроде бы работает, но есть одно но, после того, как изображение загружено, если повторно нажать обновить страницу, при при этом не указывать путь к загружаемой картинке. Создается копия изображений (оригинала при загрузке и отзеркаленного).

Сначала думал, что все дело в том, что в $_POST['received_image'], остается значение и попробовал после
// Загружаем изображение на сервер
                $url = $_POST['received_image'];

Вставить unset($_POST['received_image']);. Итог — ключ из массива удаляется, копии изображений при обновление страницы как создавались так и создается :(.

Как исправить? Хочу, что бы после загрузки в директории появлялось 2 изображения (загруженное и отзеркаленное) и простые обновления страницы не создавали дублей, но не пойму как :(
  • Вопрос задан
  • 233 просмотра
Подписаться 2 Простой 5 комментариев
Решения вопроса 1
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Это же обычное поведение браузера: когда нажимаете F5 он повторяет запрос включая данные, которые были отправлены. То есть ваш POST запрос повторяется при обновлении. Вам unset($_POST['received_image']) делать не нужно, просто при успешном завершении сделайте редирект на эту же страницу или на начальную, чтобы сменить тип запроса с POST на GET.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы