_ne_scaju_
Привет, задался таким вопросом, можно вывести изображение из бд и подставить в поле input, при редактировании данных (именно имя изображения подставить в поле).
Пример:PHP:
<input type=«file» name=«upload_ava» class=«form-control input-sm» id=«img» value=«1610317106_1.jpg»>Я хочу чтобы при отправке формы изменении данных, если ранее было загружено изображение его имя подставилось в поле выбора изображения, такое возможно, ну типа чтобы по умолчанию было в форме уже существующее имя изображение из БД.
Sail
Ну, предположим:
Код (PHP):
<?php $imageName = «1610317106_1.jpg»; // любым удобным способом инициализируем переменную ?> <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:
# максимальный размер файла 5 метров const MAX_SIZE_IMG = (1024 * 1024 * 5); # разрешенный тип передаваемого файла const MIME_TYPE = [‘image/png’, ‘image/jpeg’, ‘image/bmp’]; private $_mime_type = [], # массив mimetype изображения $_max_size_img, # максимальный размер файла $_width = 4000, # ширина изображения $_height = 4000, # высота изображения $_directory = NULL, # директория изображения $_name; # имя изображения /** * @param return — возвращает объект mimetype файла */ $this -> _mime_type = $a; return $this; } /** * @param return — возвращает объект ширину и высоту изображения */ public function ImageSize( int $w, int $h ) { $this -> _width = $w; $this -> _height = $h; return $this; } /** * @param return — возвращает объект по указанного пути */ public function SaveDirectory(string $dir) { $this -> _directory = «{$_SERVER[‘DOCUMENT_ROOT’]}/{$dir}«; return $this; } /** * @param return — возвращает объект имени файла */ public function SaveName(string $name) { $this -> _name = $name; return $this; } /** * @param return — возвращает код ошибки */ private function ErrorCode(int $a) { return [ 0 => false, 2 => false, UPLOAD_ERR_INI_SIZE => ‘Размер принятого файла превысил максимально допустимый размер.’, UPLOAD_ERR_PARTIAL => ‘Загружаемый файл был получен только частично.’, UPLOAD_ERR_NO_FILE => ‘Изображение не выбрано.’, UPLOAD_ERR_NO_TMP_DIR => ‘Отсутствует временная папка.’, UPLOAD_ERR_CANT_WRITE => ‘Не удалось записать файл на диск.’, UPLOAD_ERR_EXTENSION => ‘PHP — расширение остановило загрузку файла.’ ][$a]; } /** * Метод «проверяет заполнения формы для изображения» * @param return — выводим булевое значение TRUE если успешно прошла валидация и сохранение изображения, иначе FALSE */ public function checkFormFileExists($files, $size = 0) { # проверяем подмену поля выбора изображения $this -> error = ‘Изменять поля ввода в режиме разработчика запрещенно!’; return false; } # проверяем код ошибок // if (!empty($this -> ErrorCode($files[‘upload_ava’][‘error’]))) { // $this -> error = $this -> ErrorCode($files[‘upload_ava’][‘error’]); // return false; // } # проверяем существования директории $this -> error = ‘Такой директории не существует!’; return false; } # получаем тип загружаемого файла, разбив его на ; точку запятой // $files[‘upload_ava’][‘type’] # проверяем MIME_TYPE на подмену return false; } # сверяем миме тип с пришедшим к нам из формы $this -> error = ‘Недопустимы тип файла (разрешено: .png, .jpeg, .bmp)’; return false; } else { # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения switch ($MIME) { case ‘image/png’: break; case ‘image/jpeg’: break; case ‘image/bmp’: break; } # получаем высоту и ширину изображения # проверяем ширину и высоту изображения if ($this -> _width < $SX || $this -> _height < $SY) { $this -> error = ‘Недопустимая ширина или высота изображения (max 4000×4000)’; return false; } # проверяем макс вес файла if ($this -> _max_size_img = ($size ?: self::MAX_SIZE_IMG) < $files[‘upload_ava’][‘size’]) { $this -> error = ‘Недопустимый максимальный размер изображения (max 5 mb.)’; return false; } } return true; }вызываю метод в контроллере editProfileAction()
PHP:
if (!$img -> checkFormFileExists($_FILES, 0)) { $this -> view -> message(‘error’, $img -> error); }при нажатии на кнопку отправить у меня проверяется выбрано ли изображения, я уту проверку убрал, далее проверяется тип, и его я убрал, и все ниже проверки убрал, зашел в else в case попробовал отдать тип на прямую
PHP:
$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:
# проверяем подмену поля выбора изображения $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!’; return false; }else{ # проверяю на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип данных if ($files[‘upload_ava’][‘tmp_name’] != ») { # получаем тип загружаемого файла, разбив его на ; точку запятой # проверяем MIME_TYPE на подмену return false; } # сверяем миме тип с пришедшим к нам из формы $this -> error = ‘Недопустимы тип файла (разрешено: .png, .jpeg, .bmp)’; return false; } }else{ return true; } }если с таким решением вы не согласны или есть решение по лучше, проверка на пустоту отпишитесь подскажите как правильно, спасибо.
Дюран
Это просто не такая элементарная задача.
Я себе делаю примерно так:
— завожу поле 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:
public function checkFormFileExists($files, $size = 0) { # проверяем подмену поля выбора изображения $this -> error = ‘Изменять поля ввода в режиме разработчика запрещено!’; return false; } # проверяем на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип, вес изображения и т.д. if ($files[‘upload_ava’][‘name’] != ») { # проверяем код ошибок $this -> error = $this -> ErrorCode($files[‘upload_ava’][‘error’]); return false; } # проверяем существования директории $this -> error = ‘Такой директории не существует!’; return false; } # получаем тип загружаемого файла, разбив его на ; точку запятой # проверяем MIME_TYPE на подмену return false; } # сверяем миме тип с пришедшим к нам из формы $this -> error = ‘Недопустимый тип файла (разрешено: .png, .jpeg, .bmp)’; return false; } else { # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения switch ($MIME) { case ‘image/png’: break; case ‘image/jpeg’: break; case ‘image/bmp’: break; } # получаем высоту и ширину изображения # проверяем ширину и высоту изображения if ($this -> _width < $SX || $this -> _height < $SY) { $this -> error = ‘Недопустимая ширина или высота изображения (max 2000×2000)’; return false; } # проверяем макс вес изображения if ($this -> _max_size_img = ($size ?: self::MAX_SIZE_IMG) < $files[‘upload_ava’][‘size’]) { $this -> error = ‘Недопустимый максимальный размер изображения (max 5 mb.)’; return false; } } }else{ return true; } return true; }Всем за обсуждения спасибо.
Похожие записи:
- Программы C и C ++, позволяющие увеличить время доступа к файлам
- как запустить два экземпляра браузера Chrome, каждый из которых использует отдельные профили
- Программный драйвер аналого-цифрового преобразователя
- Базовый калькулятор графического интерфейса Python с использованием tkinter
- Реализация функции шаблона recursive_replace_copy_if на C ++