За последние 24 часа нас посетили 73599 программистов и 10174 робота. Сейчас ищет 2881 программист ...

Масштабирование (обрезка) изображения при загрузке

Тема в разделе "PHP для новичков", создана пользователем ramon149, 4 авг 2016.

  1. ramon149

    ramon149 Новичок

    С нами с:
    4 авг 2016
    Сообщения:
    4
    Симпатии:
    0
    Доброго времени суток!
    Прошу помощи с вопросом: при загрузке на сайт одного изображения (анонса для статьи) нужного его масштабировать и обрезать при необходимости.
    Есть плагин отвечающий за загрузку, проверку и ограничения
    PHP:
    1. <?php
    2. if ($modx->event->name == 'OnDocFormSave') {
    3.       if($mode == 'new'){
    4.         if (!empty($_FILES)) {
    5.            
    6.             $id = $resource->get('id');
    7.             $folder = 'images/logo-projects'; // имя папки куда грузить, должна быть создана (в корне сайта)
    8.             $path = MODX_BASE_PATH.'/'.$folder.'/'; // Путь от корня до нужного места
    9.             $tv_name = 'image-logo-project'; // имя тв
    10.            
    11.             // все значения файла
    12.             $nameFile = $_FILES['image-logo-project']['name'];
    13.             $typeFile = $_FILES['image-logo-project']['type'];
    14.             $tmpNameFile = $_FILES['image-logo-project']['tmp_name'];
    15.             $sizeFile = $_FILES['image-logo-project']['size'];
    16.            
    17.             $limit_size = 3*1024*1024; // 3 Mb - максимальный размер загружаемого файла
    18.             $file_types = array("jpeg", "jpg", "png"); // доступные расширения для загрузки
    19.             $extensionFile = substr(strrchr($nameFile, '.'), 1); // получаем расширение файла
    20.            
    21.            
    22.             $NewNameFile = 'id_'.$id.'_'.date("m_d_y").'.'.$extensionFile;  // наше новое имя файла
    23.            
    24.             if(is_uploaded_file($tmpNameFile)) // проверяем зашёл ли файл
    25.             {
    26.                 if($limit_size > $sizeFile)
    27.                 { // Проверка на размер
    28.                     if(in_array($extensionFile, $file_types)){ // проверка на тип
    29.                          move_uploaded_file($tmpNameFile, $path.$NewNameFile); // загрузка файла
    30.                          $resource->setTVValue($tv_name, $folder.'/'.$NewNameFile); // запись в ТВ
    31.                     }
    32.                 }
    33.             }
    34.         }
    35.     }
    36. }
    Как правильно сделать масштабирование, а при необходимости обрезку в рамках плагина.
    Спасибо!
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    добавить после/перед перемещением файла всю необходимую для обрезки байду - получение размера, проверка размера на выход за лимиты, собственно обрезка или масштабирование, запись нового изображения в файл.
    И да, по расширению с файлами работает только говно производства микрософт - виндовз. Весь адекватный мир смотрит на содержимое файла. Кури MIME TYPE и думай как это чудо заюзать в своём скрипте. Если лень думать - можешь погуглить по форуму. Я уже не раз выкладывал листинги по работе с загружаемыми файлами в целом, и по работе с миметайпами и размерами изображений в частности.
     
    denis01 нравится это.
  3. ramon149

    ramon149 Новичок

    С нами с:
    4 авг 2016
    Сообщения:
    4
    Симпатии:
    0
    Спасибо, буду искать!
    думать не лень, знать бы куда думать - в php нуб
     
  4. ramon149

    ramon149 Новичок

    С нами с:
    4 авг 2016
    Сообщения:
    4
    Симпатии:
    0
    А если для получения расширения использовать
    PHP:
    1.  // получаем расширение файла
    2. //использовать
    3. $extensionFile = pathinfo($nameFile, PATHINFO_EXTENSION);
    4. //вместо
    5. $extensionFile = substr(strrchr($nameFile, '.'), 1);
    Лучше именно mime type? а для mime type:
    PHP:
    1. $finfo = finfo_open(FILEINFO_MIME_TYPE);
    то в рамках плагина это будет
    PHP:
    1. $extensionFile = finfo_open(FILEINFO_MIME_TYPE);  //на сколько понимаю получение mime
    2.    switch($extensionFile) //а тут идет сравнения
    3.    {
    4.        case 'image/jpeg':
    5.        $this->type = "jpg";
    6.        return true;
    7.        case 'image/jpg':
    8.        $this->type = "jpg";
    9.        return true;
    10.        case 'image/png':
    11.        $this->type = "png";
    12.        eturn true;
    13.        default:
    14.        return false;
    15.    }
    16.  finfo_close($extensionFile);
    Написал скорей всего не верно, если поможешь буду признателен или куда думать.
    Вопрос: есть разница между в данном случае с mime - jpg и JPG и с другими расширениями аналогично?
     
  5. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.870
    Симпатии:
    955
    Когда ты делаешь свич ты можешь несколько кейсов подряд объявить и только потом начать работать с телом. А если ты не прервал тело брейком то произойдет проход на следующий кейс. Очень удобно.
    Это про твой код.

    Про регистр расширения - да хоть ziP или eXe - если содержимое файла будет image/jpeg, то любая адекватная ОС будет работать с ним как с изображением. Дело в том, что нормальные оси - никсы - читают первые Х байт из файла и применяют к ним таблицу миметипов. Так ОСь с почти 100% уверенностью знает, что за содержимое хранится в файле. Винда же еще в каменном веке придумала использовать расширение файла для идентификации его содержимого. Так что только винде не по барабану на эти забавные символы после последней точки в имени файла. Остальному миру практически посрать. Там есть маленькие нюансы, но они не так влияют на работу системы, как в винде.