Привет, задался таким вопросом, можно вывести изображение из бд и подставить в поле input, при редактировании данных (именно имя изображения подставить в поле). Пример: PHP: <input type="file" name="upload_ava" class="form-control input-sm" id="img" value="1610317106_1.jpg"> Я хочу чтобы при отправке формы изменении данных, если ранее было загружено изображение его имя подставилось в поле выбора изображения, такое возможно, ну типа чтобы по умолчанию было в форме уже существующее имя изображение из БД.
Ну, предположим: Код (PHP): <?php $imageName = "1610317106_1.jpg"; // любым удобным способом инициализируем переменную ?> <input type="file" name="upload_ava" class="form-control input-sm" id="img" value="<?= $imageName ?>">
У меня есть пользователя данные, которые хочу изменить не меняя изображения, но если изображение не выберу при отправке формы я ругаюсь что изображение не выбрано. Как бы для этого мне и нужно. А вообще как это правильно делать дать пользователю возможность изменять все данные в том числе и изображение в одной форме или разделить изменение изображения в отдельной форме? Если предпочтителен второй вариант тогда проблем нет будет работать как задумано, и имя изображения не нужно будет. Подскажите мне спасибо. --- Добавлено --- Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименования изображения.
Я не делаю изображение обязательным при редактировании (даже если оно обязательно при создании), и проверяю на сервере - пришла новая картинка, меняю, не пришла, не меняю.
Это один из "любых способов" инициализации переменной. Соответсвенно, какую переменную инициализировали - такую и используйте.
Обязательно инициализировать, не хватит того что я получил данные из запроса в переменной например $res в ней уже есть наименован Хорошо подумаю как изменить проверку. --- Добавлено --- Сегодня проверю, если проверку не передалаю.
а сравниваете тип изображения, что вам пришло, ну типо если не изображение тип до досвидос, просто сейчас не пойму, как разрешить пользователю изменять данные даже если изображение не выбрано, а если выбрано то проверить изображение пришло или нет.
Проверяю, есть ли что-то в массиве $_FILES или нету, делов-то. Ну, точнее, фреймворк проверяет, но я и сам могу, если надо
И так предположим, взяли готовый класс для проверки изображения автор (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 файла */ public function setMimeType( array $a ) { $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) { # проверяем подмену поля выбора изображения if (!isset($files['upload_ava'])) { $this -> error = 'Изменять поля ввода в режиме разработчика запрещенно!'; return false; } # проверяем код ошибок // if (!empty($this -> ErrorCode($files['upload_ava']['error']))) { // $this -> error = $this -> ErrorCode($files['upload_ava']['error']); // return false; // } # проверяем существования директории if (!file_exists ($this -> _directory)) { $this -> error = 'Такой директории не существует!'; return false; } # получаем тип загружаемого файла, разбив его на ; точку запятой $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0]; // $files['upload_ava']['type'] # проверяем MIME_TYPE на подмену if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) { $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D); return false; } # сверяем миме тип с пришедшим к нам из формы elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) { $this -> error = 'Недопустимы тип файла (разрешено: .png, .jpeg, .bmp)'; return false; } else { # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения switch ($MIME) { case 'image/png': $IGD = ImageCreateFromPNG($files['upload_ava']['tmp_name']); break; case 'image/jpeg': $IGD = ImageCreateFromJPEG($files['upload_ava']['tmp_name']); break; case 'image/bmp': $IGD = ImageCreateFromWBMP($files['upload_ava']['tmp_name']); break; } # получаем высоту и ширину изображения $SX = ImageSX ($IGD); $SY = ImageSY ($IGD); # проверяем ширину и высоту изображения if ($this -> _width < $SX || $this -> _height < $SY) { $this -> error = 'Недопустимая ширина или высота изображения (max 4000x4000)'; 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 и уже в новом методе делать эту проверку? но все же хотелось бы чтобы все было в одной форме, чтобы имя, фамилия изображения изменялось по желанию в одной форме а не в отдельных. Жду ваших советов спасибо.
почему я проверил полностью работает класс, как задумано, но я не пойму а как пользователя пропустить если изображение пусто не выбрано, вот и все.
я бы прикрутил менеджер изображений, как в опенкарт я его и прикрутил, когда возникла необходимость )) --- Добавлено --- т е при клике на картинку открывается менеджер изображений в модальном окне. В нём есть возможность ходить по папкам (внутри папки image). Есть возможность выбрать уже загруженное изображение или загрузить и выбрать загруженное. Таким образом, в форме у тебя в hidden инпуте лежит путь к файлу. Который ты просто выводишь в этот инпут и не паришься по поводу, так сказать. Вообще, мне кажется, полезно поработать уже с готовым продуктом и посмотреть как люди реализовывают решения. Опенкарт, конечно, не идеал, но как первый серьёзный инструмент вполне годится ) Сейчас уже облюбованную лару потихоньку осваиваю на реальном проекте )
в данном случае я пишу для себя проект, пока не хочу использовать готовое решения, мне нужно разобраться как работает все это добро)
Так вроде получилось сделать, но это не точно завтра перепроверю!!! PHP: # проверяем подмену поля выбора изображения if (!isset($files['upload_ava'])) { $this -> error = 'Изменять поля ввода в режиме разработчика запрещено!'; return false; }else{ # проверяю на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип данных if ($files['upload_ava']['tmp_name'] != '') { # получаем тип загружаемого файла, разбив его на ; точку запятой $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0]; # проверяем MIME_TYPE на подмену if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) { $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D); return false; } # сверяем миме тип с пришедшим к нам из формы elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) { $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, не сильно сложно получилось, в расширение переделывать лень, т.к. фреймворк уже поменее используется, и никому труд будет не нужен
Норм сделал как хотел, пример что получилось: Спойлер: Метод проверки изображения PHP: public function checkFormFileExists($files, $size = 0) { # проверяем подмену поля выбора изображения if (!isset($files['upload_ava'])) { $this -> error = 'Изменять поля ввода в режиме разработчика запрещено!'; return false; } # проверяем на пустоту, если пусто возвращаю true разрешаю пройти без изображения иначе проверяем тип, вес изображения и т.д. if ($files['upload_ava']['name'] != '') { # проверяем код ошибок if (!empty($this -> ErrorCode($files['upload_ava']['error']))) { $this -> error = $this -> ErrorCode($files['upload_ava']['error']); return false; } # проверяем существования директории if (!file_exists ($this -> _directory)) { $this -> error = 'Такой директории не существует!'; return false; } # получаем тип загружаемого файла, разбив его на ; точку запятой $MIME = explode (';', (new \finfo(FILEINFO_MIME)) -> file($files['upload_ava']['tmp_name']))[0]; # проверяем MIME_TYPE на подмену if (count($D = array_diff($this -> _mime_type, self::MIME_TYPE)) > 0) { $this -> error = 'Отказано в доступе для типа файла в: ' . implode (', ', $D); return false; } # сверяем миме тип с пришедшим к нам из формы elseif(!in_array($MIME,($this -> _mime_type ?: self::MIME_TYPE))) { $this -> error = 'Недопустимый тип файла (разрешено: .png, .jpeg, .bmp)'; return false; } else { # создаем изображение из выбранного файла, в зависимости от выбранного формата изображения switch ($MIME) { case 'image/png': $IGD = ImageCreateFromPNG($files['upload_ava']['tmp_name']); break; case 'image/jpeg': $IGD = ImageCreateFromJPEG($files['upload_ava']['tmp_name']); break; case 'image/bmp': $IGD = ImageCreateFromWBMP($files['upload_ava']['tmp_name']); break; } # получаем высоту и ширину изображения $SX = ImageSX ($IGD); $SY = ImageSY ($IGD); # проверяем ширину и высоту изображения if ($this -> _width < $SX || $this -> _height < $SY) { $this -> error = 'Недопустимая ширина или высота изображения (max 2000x2000)'; 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; } Всем за обсуждения спасибо.