Всем привет! Проблема такая: От клиента мне приходит файл в base64 и список параметров. Файл должен быть изображением. На JS я это конечно проверяю, но естественно эту проверку можно обойти. Далее файл и параметры отправляются в обработчик. PHP: list($type, $data) = explode(';', $image[0]); list(, $data) = explode(',', $data); $data = base64_decode($data); Потом мне нужно обработать файл с помощью Imagick (ресайз, поворот, масштабирование, фильтры и т.п.). Читаем файл: PHP: $im = new \Imagick(); $im->readImageBlob($data); Если пришло изображение, то всё работает. Если же отправить, например текстовый файл, то выдаёт ошибку: NoDecodeDelegateForThisImageFormat `' @ error/blob.c/BlobToImage/355 Собственно вопрос: как проверить, что файл является картинкой и избежать ошибок. Также хотелось бы обезопасить себя от вредоносного кода. На GD я просто пересохранял полученный файл, а вот с Imagick не приходилось работать. Что посоветуете?
@Sergey_Tsarev а что делаете если не секрет??) я недавно похожее делал только с GD)) и предстоит дальше развивать - тоже делать переворачивание, обрезание и т.п.)
@Алекс8, загрузчик фото. Я уже писал тут про это. Клиент выбирает какие изображения загрузить. На клиенте создаются миниатюры в canvas. Так же клиент может задать параметры обработки фото - поворот, обрезка, наложение фильтров. Файлы отправляются на сервер только после отправки формы. Отправляется массив, примерно вот такой: PHP: $array = [ 'image_1' => [ 'image' => 'строка в base64', 'param' => [ 'rotate' => 90, 'crop' => [135,260], 'filters' => ['sepia', 'saturation', 'brightess'], ], ], ]; Ну, а в обработчике соответственно файл редактируется согласно заданным параметрам и сохраняется в определенную папку. Чем мне нравится такой подход по сравнению с ajax загрузкой: - Клиент может загрузить 10 фотографий, а потом решит 5 из них удалить. Соответственно напрасно будем нагружать сервер загрузкой ненужных изображений + расходовать трафик пользователя. А если учесть, что скорость мобильного интернета зачастую оставляет желать лучшего, то и будем заставлять пользователя ждать пока загрузятся выбранные им изображения. - Так как все манипуляции по загрузке и редактированию изображений происходят на клиенте, на сервер отправляются уже только необходимые данные. Соответственно снижается нагрузка на сервер и мы избегаем лишних манипуляций. Единственное после отправки формы клиенту приходится ждать пока загрузятся все изображения и только после этого произойдёт отправка формы. Но я сделал строку состояния процесса загрузки файлов и отправки формы - так, что клиент понимает, что его комп/браузер не завис. А во-вторых клиент может спокойно отойти от компа, так как основная работа выполнена и для последующих манипуляций его участие не требуется
@Sergey_Tsarev я на сколько помню я линк на файл имагику скармливаю, а на получение файла можно посмотреть какое расширение у него и так определить чё это картинка или нет.
@askanim, расширение файла - сугубо лично дело того, кто, или что этот файл создал(о) @Sergey_Tsarev, вот инструмент для определения типа изображения: int exif_imagetype(string $filename)
а почему бы не получать файл, зачем получать base64 ? --- Добавлено --- изначально то это полюбому файл, зачем приводить его к base64?
Вот изначальная тема, созданная мной: https://php.ru/forum/threads/zagruzka-izobrazhenij-s-predprosmotrom.66790/
@Sergey_Tsarev кстати читал про конвас, говорят он затупок ещё тот. ЛУчше самому нативно на js написать для обрезки картинки
@Sergey_Tsarev и вернёмся к нашим баранам. Я тоже так делаю! Обрезаю картинки у себя в движке! И вот что я вам скажу изначально я принимаю на сервере файл с которым потом работаю сохраняю его, потом его гружу в имагик там обрезаю и сохраняю его. --- Добавлено --- @Sergey_Tsarev если вы делаете по другому вы что-то делаете не правильно.
@Sergey_Tsarev в $_FILES отправляю и координаты которые режу в посте отправляю. --- Добавлено --- а там уже на php режу как надо
Есть вот такое решение: PHP: $encoded_string = "...."; $imgdata = base64_decode($encoded_string); $f = finfo_open(); $mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE); Ну и $mime_type на проверку.
куда подробней тебе ещё, print_r($_FILES) сделай и всё поймёшь, как отправить file ? Ложишь в инпут файл забираешь его в formData --- Добавлено --- и отправляешь его аяксом на сервер в чём проблема. А там в глобальном массиве $_FILES он уже будет если правильно всё отправил.
@askanim, ну я о том и спрашивал) я думал о таком варианте, что бы загружать файлы аяксом после нажатия на submit. В общем-то не в том дело, каким способом отправляются файлы на сервер. Меня больше интересует можно ли в Imagick пересохранить картинку как в GD? Или сохранять её при помощи GD, а редактировать уже при помощи Imagick?
@Sergey_Tsarev Ты когда ложишь картинку в имагик на выхлопе ты можешь получить блоб, и сохраняешь его в файл примерно вот так это происходит: PHP: file_put_contents ([file_path], $image->getImageBlob()); --- Добавлено --- А ложится в имагик вот так PHP: $image = new \Imagick(realpath([file_path])); --- Добавлено --- Пересохранить можно, но не так как в гд, в гд ты конкретно указываешь метод формата сохранения. А здесь ты сам в какой формат файла запишешь в тот и запишешь.