• Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, и эту главу и Request и Cached прочитал не раз. По документации реализовал response с 304 ответом и дописанными вручную заголовками.

    Но в любом случае для значения заголовка Etga получить хэш. Наверное в любом случае нужно будет производить (сравнение с файлом и пришедшим урл). И ещё интересный вопрос, как полученный хэш записать в значение заголовок ETag при ответе...на php ничего сложного:
    $file = ...
      $last_modified_time = filemtime($file); 
      $etag = md5_file($file);
    
      header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
      header("Etag: $etag"); 
    
      //... проверка по last_modified_time, если true, то header("HTTP/1.1 304 Not Modified");


    Но тут люмен, с которым я познакомился менее недели назад :). Поэтому уже рассматриваю вариант вручную реализовать Etag в моей задачи, так как информации найти не могу :(
  • Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Кэш, но не самопальный :) так что вы почти правы))
    Если в двух словах: на сервер приходит запрос, среди прочего в нем есть url изображения (это сервис email рассылки, развернут с помощью PHPMailer и Lumen).
    Изображение это не будет меняться или ооочень редко. Соответственно хочу закешировать, логика у меня такая:
    1. При первом запросе получить хэш файла и поместить во временный файл (либо скопировать содержимое через file_put_content и поместить в файл, тут пока ХЗ у меня такого рода задача - первый раз попалась).
    2. При повторном запросе сравнить суммы и в случае совпадения отдать 304.

    Пока на этапе создания файла и сравнения имеющегося хэша и вновь пришедшего. Как решу эту задачу уже буду работать с HTTP заголовками (планирую реализовать через ( ETag + If-None-Match)

    P.S. читал доки по Люмену, честно говоря так и не вкурил, как через него все реализовать, а сидеть и чахнуть не хочеться, поэтому решил пойти иным путем.
  • Fileinfo() получение информации о типе файла по url. Как сделать?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Спасибо! Прям то что нужно :)
    is_Image

    private static function is_Image(string $filename): string
        {
            if (!defined('ALLOWED_MIME_TYPE')) {
                define('ALLOWED_MIME_TYPE', [
                    'png' => 'image/png',
                    'jpe' => 'image/jpeg',
                    'jpeg' => 'image/jpeg',
                    'jpg' => 'image/jpeg',
                    'gif' => 'image/gif',
                    'bmp' => 'image/bmp',
                    'ico' => 'image/vnd.microsoft.icon',
                    'tiff' => 'image/tiff',
                    'tif' => 'image/tiff',
                    'svg' => 'image/svg+xml',
                    'svgz' => 'image/svg+xml'
                ]);
            }
            list($width, $height) = getimagesize($filename); // Getting image size
            $imgInfo = new finfo(FILEINFO_MIME_TYPE);
            $imgMime = $imgInfo->buffer(file_get_contents($filename));
    
            // Checking image type
            if (array_search($imgMime, ALLOWED_MIME_TYPE)) {
                // ...
            } else {
                self::userError("'logo_url': invalid image format. given - {$imgMime}");
            }
            return $filename;
        }

  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Lander, чувствую вопрос с подвохом :) Конечно знаю.
    Если вы про эту строчку
    сохранить в файл (пока задумка реализовать через tmpfile())

    То я написал предварительно)) сейчас я понял, что такой вариант не подойдет, а нужно использовать tempnam()
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Lander, ну я думал вопрос тривиальный и ответ о нем не знаю только я :) поэтому спросил без уточнения, а в итоге получилось не все так однозначно))

    А то получается что у вас любой файл после получения о нем информации удаляется с сервера.

    Это и нужно) Да и из файлов передаются только изображения, остальное текстовая информация.
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    DevMan,
    я когда-то задавался подобным вопросом и ради этого заглянул в исходники

    Я ещё в начале тернистого пути :) подобные попытки уже предпринимаю, но пока с переменным успехом. А тут на ровном месте, так "зарылся" что подумал: "лучше спросить, чем ковырять исходники"

    кстати, если вам нужны только размеры, и файлы могут быть большими, лучше пользовать не getimagesize(), а что–то вроде https://github.com/tommoor/fastimage

    Кстати, сегодня при поисках инфы по getimagesize натыкался на эту репу.

    Спасибо за рекомендацию.
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    К этому варианту я тоже склонялся. Спасибо!
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Nujabes37, вот и мне сегодня таракан в голову залез, уже несколько раз перечитывал офф.доки и на русском и на анг (хз. думал может перевели криво :)). Нигде не сказано, что файл сохраняется или что файл не сохраняется.

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

    Вот сижу и "меня терзают смутные сомнения" :)

    p.s. наверное "пока не попробуешь не узнаешь". Завтра попробую через него (так как по мне это самый очевидные и оптимальный вариант). А дальше виднее будет.

    p.s. вторым ответом опередили :)))
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Так, мое предположение разнесено в пух и прах :) Эт хорошо, спасибо!
    Я не просто так, на ночь глядя: "дай думаю задам странный вопрос".

    Дело в том, что прилетела задача с которой ранее не сталкивался. И как я у уже понял getimagesize() для неё не подойдет.

    Суть в том, что на сервер приходит запрос, в запросе среди прочего есть url картинки. От этого url мне нужно получить 3 вещи:
    1. Размеры (длина, ширина)
    2. Тип изображения
    3. Хэш-сумму файла

    1. - 2. нужны для проверки корректности передаваемых данных. Так как запросы достаточно однотипны и сам url будет меняться крайне-крайне редко, нужно взять hash файла, сохранить в файл (пока задумка реализовать через tmpfile()) и при повторном запросе сравнивать суммы и если они совпадают отдавать 304, что бы не загружать сервер.

    Сам файл хранить на сервере нет никакого смысла, не подскажете альтернативу getimagesize(), откуда можно выдернуть эти данные?
  • Не корректно отрабатывает try\catch. Как исправить?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    getMessage(); - выводит текст сообщения переданный в конструктор, если мне не изменяет память.
    Но вот вопрос, почему тогда я не получаю текст, который я сгенерировал в throw.

    Просто я предполагал следующее,
    Создал класс (EmailSendingFailed) -> Сгенерировал исключение (("Couldn't send email. Invalid sender address '{$recipient->email}'."))->"сломал" отправку писем->При попытке отправить письмо должно появиться сообщение:

    Couldn't send email. Invalid sender address mailmail.ru.

    и...скрипт на этом должен прекратить работу. А по итогу сообщения - нет, скрипт отработал (но при этом письмо не отправилось конечно же). Хотя я уже может "загнался" на этих исключениях и не виду очевидных вещей...
  • Что я указываю неправильно в функции filter_var(..., FILTER_VALIDATE_REGEXP, ...)?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    С третьим вариантом я почти угадал :). Спасибо!
  • Почему не срабатывает условие if else?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Рональд Макдональд, спасибо, что разжевали! Действительно использование флагов рулит :) Вот такой вариант заработал.
    let allNotChecked = true;
    for (let i = 0; i < buttonsOperations.length; i++) {
        elementEnable(firstArgument, 'input', btnResult);
        elementEnable(secondArgument, 'input', btnResult);
        elementEnable(buttonsOperations[i], 'input', btnResult);
        if (buttonsOperations[i].checked === true) {
            allNotChecked = false;
            let operator = buttonsOperations[i].getAttribute('data-operation');
            calculatorOperator(operator);
            elementDisable(btnResult);
        }
        if (allNotChecked === true) {
            output.innerHTML = '<strong>Ошибка!</strong> Арифметическая операция не выбрана.';
        }
    }
  • Почему не срабатывает условие if else?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Вы имели ввиду, что-то вроде этого?
    for (let i = 0; i < buttonsOperations.length; i++) {
        elementEnable(firstArgument, 'input', btnResult);
        elementEnable(secondArgument, 'input', btnResult);
        elementEnable(buttonsOperations[i], 'input', btnResult);
    
        let allNotChecked = true;
        if (buttonsOperations.checked === true) {
            if (allNotChecked) {
                allNotChecked = false;
                let operator = buttonsOperations[i].getAttribute('data-operation');
                calculatorOperator(operator);
                elementDisable(btnResult);
            }
        } else {
            output.innerHTML = '<strong>Ошибка!</strong> Арифметическая операция не выбрана.';
        }
    }


    Честно говоря не понял, как тут флаг вкорячить и проверить на true\fasle
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, А насчет imagick надо будет попробовать, честно говоря до сегодняшнего дня я думал, что с помощью php можно делать какие-то "топорные" вещи из разряда: создать,удалить, изменить размер,конвертировать. Но все оказывается намного гибче.

    сократить начало, ресурс можно получать независимо от расширения файла

    Спасибо за совет! Действительно можно чутка сократить код :)
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Блин оказалось все крайне просто :)
    В начале файла session_start();, а перед редиректом переменные, которые указывались в качестве пути у изображений переместить в
    $_SESSION['save_origin'] = $new_name_original;
    $_SESSION['save_processed'] = $new_name_processed;


    А я голову ломал. Но спасибо за совет насчет редиректа. Не сообразил сразу.
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, честно говоря, с изображениями я ранее не работал. Сегодня вот первый раз ковырялся и начал использовать тот функционал, который первый в гугле нашел :)

    Вы имеете ввиду, что-то вроде этого? пример отражения изображения?
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Копии перестали создавать, но появилась другая проблема. Теперь не выводятся изображения. На pastebin выложил полностью скрипт и разметку.

    Поясню в скрипте, если выполняется условие:
    count($_POST) > 0 && isset($_POST['received_image'])
    , то флаг $image_correct меняет значение на true и создается два изображения (оригинальное загруженное и отзеркаленное.

    Позже по флагу я делаю проверку и вывожу (или нет) html разметку, в которой я размещаю созданные изображения. Вот пример:
    5d4af771768ba700168456.png

    Редирект (
    header('Location: /public_html/task3_updated.php');
    ) я расположил в конце условия, после отчисти памяти "imagedestroy". И когда меня редиректит на эту же страницу - блок с изображениями не показывается.

    Я пробовал убрать флаг и условие, но тогда лезут нотисы, что невозможно найти изображения по указанному пути.
    5d4af8548c495381927423.png

    Как я понял это происходит из-за того, что страница обновляется и переменные, которые я указал в src = " .. ." просто не существую, но вот как это исправить - не моуг сообразить.
  • Как реализовать функцию проверки подключения файла?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Блин а я ведь знал про работу с флагами, но чего-то уперся в то, что нужно разделить все на несколько функций. Спасибо!