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

_ne_scaju_

Привет, задался таким вопросом, можно вывести изображение из бд и подставить в поле input, при редактировании данных (именно имя изображения подставить в поле).
Пример:

PHP:
  1. <input type=«file» name=«upload_ava» class=«form-control input-sm» id=«img» value=«1610317106_1.jpg»>

Я хочу чтобы при отправке формы изменении данных, если ранее было загружено изображение его имя подставилось в поле выбора изображения, такое возможно, ну типа чтобы по умолчанию было в форме уже существующее имя изображение из БД.

 

Sail

Ну, предположим:

Код (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 ?>«>
 

mkramer

@_ne_scaju_, а толку от этого?

 

_ne_scaju_

У меня есть пользователя данные, которые хочу изменить не меняя изображения, но если изображение не выберу при отправке формы я ругаюсь что изображение не выбрано. Как бы для этого мне и нужно. А вообще как это правильно делать дать пользователю возможность изменять все данные в том числе и изображение в одной форме или разделить изменение изображения в отдельной форме? Если предпочтителен второй вариант тогда проблем нет будет работать как задумано, и имя изображения не нужно будет. Подскажите мне спасибо.
— Добавлено —

Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименования изображения.

 

mkramer

Я не делаю изображение обязательным при редактировании (даже если оно обязательно при создании), и проверяю на сервере — пришла новая картинка, меняю, не пришла, не меняю.

 

Sail

Это один из «любых способов» инициализации переменной.
Соответсвенно, какую переменную инициализировали — такую и используйте.

 

_ne_scaju_

Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименован

Хорошо подумаю как изменить проверку.
— Добавлено —

Сегодня проверю, если проверку не передалаю.

 

_ne_scaju_

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

 

mkramer

Проверяю, есть ли что-то в массиве $_FILES или нету, делов-то. Ну, точнее, фреймворк проверяет, но я и сам могу, если надо :)

 

_ne_scaju_

И так предположим, взяли готовый класс для проверки изображения автор (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 4000×4000)’;
  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 и уже в новом методе делать эту проверку?
но все же хотелось бы чтобы все было в одной форме, чтобы имя, фамилия изображения изменялось по желанию в одной форме а не в отдельных.
Жду ваших советов спасибо.

 

mkramer

А без @MouseZver никак не проверить, прислали файл или нет?

 

_ne_scaju_

почему я проверил полностью работает класс, как задумано, но я не пойму а как пользователя пропустить если изображение пусто не выбрано, вот и все.

 

TeslaFeo

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

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

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

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

 

_ne_scaju_

в данном случае я пишу для себя проект, пока не хочу использовать готовое решения, мне нужно разобраться как работает все это добро)

 

_ne_scaju_

Так вроде получилось сделать, но это не точно завтра перепроверю!!!

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.         }

если с таким решением вы не согласны или есть решение по лучше, проверка на пустоту отпишитесь подскажите как правильно, спасибо.

 

Дюран

Это просто не такая элементарная задача.
Я себе делаю примерно так:
— завожу поле 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, не сильно сложно получилось, в расширение переделывать лень, т.к. фреймворк уже поменее используется, и никому труд будет не нужен

 

_ne_scaju_

Норм сделал как хотел, пример что получилось:

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 2000×2000)’;
  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.     }

Всем за обсуждения спасибо.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *