За последние 24 часа нас посетили 10805 программистов и 781 робот. Сейчас ищут 178 программистов ...

Вывод имени изображения из бд в форму

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 11 янв 2021.

  1. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    Привет, задался таким вопросом, можно вывести изображение из бд и подставить в поле input, при редактировании данных (именно имя изображения подставить в поле).
    Пример:
    PHP:
    1. <input type="file" name="upload_ava" class="form-control input-sm" id="img" value="1610317106_1.jpg">
    Я хочу чтобы при отправке формы изменении данных, если ранее было загружено изображение его имя подставилось в поле выбора изображения, такое возможно, ну типа чтобы по умолчанию было в форме уже существующее имя изображение из БД.
     
  2. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.382
    Симпатии:
    306
    Ну, предположим:
    Код (PHP):
    1. <?php
    2. $imageName = "1610317106_1.jpg"; // любым удобным способом инициализируем переменную
    3. ?>
    4. <input type="file" name="upload_ava" class="form-control input-sm" id="img" value="<?= $imageName ?>">
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.048
    Симпатии:
    1.617
  4. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    У меня есть пользователя данные, которые хочу изменить не меняя изображения, но если изображение не выберу при отправке формы я ругаюсь что изображение не выбрано. Как бы для этого мне и нужно. А вообще как это правильно делать дать пользователю возможность изменять все данные в том числе и изображение в одной форме или разделить изменение изображения в отдельной форме? Если предпочтителен второй вариант тогда проблем нет будет работать как задумано, и имя изображения не нужно будет. Подскажите мне спасибо.
    --- Добавлено ---
    Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименования изображения.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.048
    Симпатии:
    1.617
    Я не делаю изображение обязательным при редактировании (даже если оно обязательно при создании), и проверяю на сервере - пришла новая картинка, меняю, не пришла, не меняю.
     
  6. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.382
    Симпатии:
    306
    Это один из "любых способов" инициализации переменной.
    Соответсвенно, какую переменную инициализировали - такую и используйте.
     
  7. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименован
    Хорошо подумаю как изменить проверку.
    --- Добавлено ---
    Сегодня проверю, если проверку не передалаю.
     
  8. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    а сравниваете тип изображения, что вам пришло, ну типо если не изображение тип до досвидос, просто сейчас не пойму, как разрешить пользователю изменять данные даже если изображение не выбрано, а если выбрано то проверить изображение пришло или нет.
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.048
    Симпатии:
    1.617
    Проверяю, есть ли что-то в массиве $_FILES или нету, делов-то. Ну, точнее, фреймворк проверяет, но я и сам могу, если надо :)
     
  10. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    И так предположим, взяли готовый класс для проверки изображения автор (MouseZver)
    PHP:
    1.     # максимальный размер файла 5 метров
    2.    const MAX_SIZE_IMG = (1024 * 1024 * 5);
    3.  
    4.     # разрешенный тип передаваемого файла
    5.    const MIME_TYPE = ['image/png', 'image/jpeg', 'image/bmp'];
    6.  
    7.     private
    8.         $_mime_type = [],   # массив mimetype изображения
    9.        $_max_size_img,     # максимальный размер файла
    10.        $_width = 4000,     # ширина изображения
    11.        $_height = 4000,    # высота изображения
    12.        $_directory = NULL, # директория изображения
    13.        $_name;             # имя изображения
    14.  
    15.  
    16.     /**
    17.      * @param return - возвращает объект mimetype файла
    18.      */
    19.     public function setMimeType( array $a ) {
    20.         $this -> _mime_type = $a;
    21.         return $this;
    22.     }
    23.  
    24.  
    25.     /**
    26.      * @param return - возвращает объект ширину и высоту изображения
    27.      */
    28.     public function ImageSize( int $w, int $h ) {
    29.         $this -> _width = $w;
    30.         $this -> _height = $h;
    31.         return $this;
    32.     }
    33.  
    34.  
    35.     /**
    36.      * @param return - возвращает объект по указанного пути
    37.      */
    38.     public function SaveDirectory(string $dir) {
    39.         $this -> _directory = "{$_SERVER['DOCUMENT_ROOT']}/{$dir}";
    40.         return $this;
    41.     }
    42.  
    43.  
    44.     /**
    45.      * @param return - возвращает объект имени файла
    46.      */
    47.     public function SaveName(string $name) {
    48.         $this -> _name = $name;
    49.         return $this;
    50.     }
    51.  
    52.  
    53.     /**
    54.      * @param return - возвращает код ошибки
    55.      */
    56.     private function ErrorCode(int $a) {
    57.         return [
    58.             0 => false,
    59.             2 => false,
    60.             UPLOAD_ERR_INI_SIZE   => 'Размер принятого файла превысил максимально допустимый размер.',
    61.             UPLOAD_ERR_PARTIAL    => 'Загружаемый файл был получен только частично.',
    62.             UPLOAD_ERR_NO_FILE    => 'Изображение не выбрано.',
    63.             UPLOAD_ERR_NO_TMP_DIR => 'Отсутствует временная папка.',
    64.             UPLOAD_ERR_CANT_WRITE => 'Не удалось записать файл на диск.',
    65.             UPLOAD_ERR_EXTENSION  => 'PHP - расширение остановило загрузку файла.'
    66.         ][$a];
    67.     }
    68.  
    69.  
    70.     /**
    71.      * Метод "проверяет заполнения формы для изображения"
    72.      * @param return - выводим булевое значение TRUE если успешно прошла валидация и сохранение изображения, иначе FALSE
    73.      */
    74.     public function checkFormFileExists($files, $size = 0) {
    75.  
    76.         # проверяем подмену поля выбора изображения
    77.        if (!isset($files['upload_ava'])) {
    78.             $this -> error = 'Изменять поля ввода в режиме разработчика запрещенно!';
    79.             return false;
    80.         }
    81.    
    82.         # проверяем код ошибок
    83.        // if (!empty($this -> ErrorCode($files['upload_ava']['error']))) {
    84.         //     $this -> error = $this -> ErrorCode($files['upload_ava']['error']);
    85.         //     return false;
    86.         // }
    87.  
    88.         # проверяем существования директории
    89.        if (!file_exists ($this -> _directory)) {
    90.             $this -> error = 'Такой директории не существует!';
    91.             return false;
    92.         }
    93.  
    94.         # получаем тип загружаемого файла, разбив его на ; точку запятой
    95.        $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0];
    96.         // $files['upload_ava']['type']
    97.  
    98.         # проверяем MIME_TYPE на подмену
    99.        if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) {
    100.             $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D);
    101.             return false;
    102.         }
    103.         # сверяем миме тип с пришедшим к нам из формы
    104.        elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) {
    105.             $this -> error = 'Недопустимы тип файла (разрешено: .png, .jpeg, .bmp)';
    106.             return false;
    107.         }
    108.         else
    109.         {
    110.             # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения
    111.            switch ($MIME)
    112.             {
    113.                 case 'image/png':
    114.                     $IGD = ImageCreateFromPNG($files['upload_ava']['tmp_name']);
    115.                     break;
    116.                 case 'image/jpeg':
    117.                     $IGD = ImageCreateFromJPEG($files['upload_ava']['tmp_name']);
    118.                     break;
    119.                 case 'image/bmp':
    120.                     $IGD = ImageCreateFromWBMP($files['upload_ava']['tmp_name']);
    121.                     break;
    122.             }
    123.             # получаем высоту и ширину изображения
    124.            $SX = ImageSX ($IGD);
    125.             $SY = ImageSY ($IGD);
    126.        
    127.             # проверяем ширину и высоту изображения
    128.            if ($this -> _width < $SX || $this -> _height < $SY) {
    129.                 $this -> error = 'Недопустимая ширина или высота изображения (max 4000x4000)';
    130.                 return false;
    131.             }
    132.             # проверяем макс вес файла
    133.            if ($this -> _max_size_img = ($size ?: self::MAX_SIZE_IMG) < $files['upload_ava']['size']) {
    134.                 $this -> error = 'Недопустимый максимальный размер изображения (max 5 mb.)';
    135.                 return false;
    136.             }
    137.         }
    138.         return true;
    139.     }
    вызываю метод в контроллере editProfileAction()
    PHP:
    1. if (!$img -> checkFormFileExists($_FILES, 0)) {
    2.   $this -> view -> message('error', $img -> error);
    3. }
    при нажатии на кнопку отправить у меня проверяется выбрано ли изображения, я уту проверку убрал, далее проверяется тип, и его я убрал, и все ниже проверки убрал, зашел в else в case попробовал отдать тип на прямую
    PHP:
    1. $files['upload_ava']['type']
    скрипт проглатил его, но все ровно выдал ошибку, типа
    Warning: imagesx() expects parameter 1 to be resource, string given in (для этой ошибки я присвоил значения по умолчанию путь к существующей заглушке)
    короче как сделать мне, лучше создать отдельный imageAction от метода profileAction и уже в новом методе делать эту проверку?
    но все же хотелось бы чтобы все было в одной форме, чтобы имя, фамилия изображения изменялось по желанию в одной форме а не в отдельных.
    Жду ваших советов спасибо.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.048
    Симпатии:
    1.617
    А без @MouseZver никак не проверить, прислали файл или нет?
     
  12. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    почему я проверил полностью работает класс, как задумано, но я не пойму а как пользователя пропустить если изображение пусто не выбрано, вот и все.
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.988
    Симпатии:
    754
    я бы прикрутил менеджер изображений, как в опенкарт :)
    я его и прикрутил, когда возникла необходимость ))
    --- Добавлено ---
    т е при клике на картинку открывается менеджер изображений в модальном окне.
    В нём есть возможность ходить по папкам (внутри папки image).
    Есть возможность выбрать уже загруженное изображение или загрузить и выбрать загруженное.

    Таким образом, в форме у тебя в hidden инпуте лежит путь к файлу.
    Который ты просто выводишь в этот инпут и не паришься по поводу, так сказать.

    Вообще, мне кажется, полезно поработать уже с готовым продуктом и посмотреть как люди реализовывают решения.
    Опенкарт, конечно, не идеал, но как первый серьёзный инструмент вполне годится )

    Сейчас уже облюбованную лару потихоньку осваиваю на реальном проекте )
     
  14. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    в данном случае я пишу для себя проект, пока не хочу использовать готовое решения, мне нужно разобраться как работает все это добро)
     
  15. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    Так вроде получилось сделать, но это не точно завтра перепроверю!!!
    PHP:
    1.        # проверяем подмену поля выбора изображения
    2.        if (!isset($files['upload_ava'])) {
    3.             $this -> error = 'Изменять поля ввода в режиме разработчика запрещено!';
    4.             return false;
    5.         }else{
    6.             # проверяю на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип данных
    7.            if ($files['upload_ava']['tmp_name'] != '') {
    8.                 # получаем тип загружаемого файла, разбив его на ; точку запятой
    9.                $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0];
    10.  
    11.                 # проверяем MIME_TYPE на подмену
    12.                if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) {
    13.                     $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D);
    14.                     return false;
    15.                 }
    16.                 # сверяем миме тип с пришедшим к нам из формы
    17.                elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) {
    18.                     $this -> error = 'Недопустимы тип файла (разрешено: .png, .jpeg, .bmp)';
    19.                     return false;
    20.                 }
    21.             }else{
    22.                 return true;
    23.             }
    24.         }
    если с таким решением вы не согласны или есть решение по лучше, проверка на пустоту отпишитесь подскажите как правильно, спасибо.
     
    #15 _ne_scaju_, 13 янв 2021
    Последнее редактирование: 13 янв 2021
  16. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    160
    Симпатии:
    4
    Это просто не такая элементарная задача.
    Я себе делаю примерно так:
    - завожу поле file, здесь будет храниться(в бд) имя прикрепленного файла и пусто, когда не прикреплен
    - для его заполнения, в форме, завожу два дополнительных поля file_upload, file_upload_check
    - file_upload - это именно поле загрузки файла
    - file_upload_check - это невидимое поле, метка что удалить предыдущий файл

    В результате получаю такие сценарии:
    1) Когда AR модель создается
    - все пусто и на форме показываем поле file_upload
    1) Когда AR модель редактируется
    - показываю на основе поля file информацию о прикрепленном файле, имя как ссылка на открытие
    - и тут же рядом кнопочку "Удалить". Если ее нажать то в file_upload_check делаем пометку что удалить старый файл и показываем поле file_upload (это на js). Т.е. мы может файл и просто открепить и прикрепить тут же другой

    Ну а на сервере мы вот с этим и работаем, типа так:
    - если уже есть прикрепленный файл и есть метка на удаление, то открепляем файл (поле file в БД='') и удаляем
    - если есть загруженный файл, то вот это он новый, переносим его куда надо и его имя в file.

    Плюсы что без всяких аякс загрузок картинок, а на обычном html как оно по простому работает.
    Делал на yii2, не сильно сложно получилось, в расширение переделывать лень, т.к. фреймворк уже поменее используется, и никому труд будет не нужен
     
  17. _ne_scaju_

    _ne_scaju_ Активный пользователь

    С нами с:
    25 ноя 2016
    Сообщения:
    2.140
    Симпатии:
    117
    Норм сделал как хотел, пример что получилось:
    PHP:
    1.     public function checkFormFileExists($files, $size = 0)
    2.     {
    3.         # проверяем подмену поля выбора изображения
    4.        if (!isset($files['upload_ava'])) {
    5.             $this -> error = 'Изменять поля ввода в режиме разработчика запрещено!';
    6.             return false;
    7.         }
    8.  
    9.         # проверяем на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип, вес изображения и т.д.
    10.        if ($files['upload_ava']['name'] != '') {
    11.  
    12.              # проверяем код ошибок
    13.             if (!empty($this -> ErrorCode($files['upload_ava']['error']))) {
    14.                  $this -> error = $this -> ErrorCode($files['upload_ava']['error']);
    15.                  return false;
    16.              }
    17.  
    18.             # проверяем существования директории
    19.            if (!file_exists ($this -> _directory)) {
    20.                 $this -> error = 'Такой директории не существует!';
    21.                 return false;
    22.             }
    23.  
    24.             # получаем тип загружаемого файла, разбив его на ; точку запятой
    25.            $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0];
    26.  
    27.             # проверяем MIME_TYPE на подмену
    28.            if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) {
    29.                 $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D);
    30.                 return false;
    31.             }
    32.             # сверяем миме тип с пришедшим к нам из формы
    33.            elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) {
    34.                 $this -> error = 'Недопустимый тип файла (разрешено: .png, .jpeg, .bmp)';
    35.                 return false;
    36.             }
    37.             else
    38.             {
    39.                 # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения
    40.                switch ($MIME)
    41.                 {
    42.                     case 'image/png':
    43.                         $IGD = ImageCreateFromPNG($files['upload_ava']['tmp_name']);
    44.                         break;
    45.                     case 'image/jpeg':
    46.                         $IGD = ImageCreateFromJPEG($files['upload_ava']['tmp_name']);
    47.                         break;
    48.                     case 'image/bmp':
    49.                         $IGD = ImageCreateFromWBMP($files['upload_ava']['tmp_name']);
    50.                         break;
    51.                 }
    52.  
    53.                 # получаем высоту и ширину изображения
    54.                $SX = ImageSX ($IGD);
    55.                 $SY = ImageSY ($IGD);
    56.                
    57.                 # проверяем ширину и высоту изображения
    58.                if ($this -> _width < $SX || $this -> _height < $SY) {
    59.                     $this -> error = 'Недопустимая ширина или высота изображения (max 2000x2000)';
    60.                     return false;
    61.                 }
    62.                 # проверяем макс вес изображения
    63.                if ($this -> _max_size_img = ($size ?: self::MAX_SIZE_IMG) < $files['upload_ava']['size']) {
    64.                     $this -> error = 'Недопустимый максимальный размер изображения (max 5 mb.)';
    65.                     return false;
    66.                 }
    67.             }
    68.         }else{
    69.             return true;
    70.         }
    71.         return true;
    72.     }
    Всем за обсуждения спасибо.