示例#1
0
文件: Thumbnail.php 项目: Liv1020/cms
 public function init()
 {
     parent::init();
     if (!$this->w && !$this->h) {
         throw new Exception("Необходимо указать ширину или высоту");
     }
 }
示例#2
0
 /**
  * Собрать URL на thumbnail, который будет сгенерирован автоматически в момент запроса.
  *
  *
  * @param $originalSrc          Путь к оригинальному изображению
  * @param Filter $filter        Объект фильтр, который будет заниматься преобразованием
  * @param string $nameForSave   Название для сохраненеия файла (нужно для сео)
  * @return string
  */
 public function thumbnailUrlOnRequest($originalSrc, Filter $filter, $nameForSave = '')
 {
     $originalSrc = (string) $originalSrc;
     $extension = static::getExtension($originalSrc);
     if (!$extension) {
         return $originalSrc;
     }
     if (!$this->isAllowExtension($extension)) {
         return $originalSrc;
     }
     if (!$nameForSave) {
         $nameForSave = static::DEFAULT_THUMBNAIL_FILENAME;
     }
     $params = [];
     if ($filter->getConfig()) {
         $params = $filter->getConfig();
     }
     $replacePart = DIRECTORY_SEPARATOR . static::THUMBNAIL_PREFIX . $filter->id . ($params ? DIRECTORY_SEPARATOR . $this->getParamsCheckString($params) : "") . DIRECTORY_SEPARATOR . $nameForSave;
     $imageSrcResult = str_replace('.' . $extension, $replacePart . '.' . $extension, $originalSrc);
     if ($params) {
         $imageSrcResult = $imageSrcResult . '?' . http_build_query($params);
     }
     return $imageSrcResult;
 }
示例#3
0
 /**
  * Lists all StorageFile models.
  * @return mixed
  */
 public function actionProcess()
 {
     ini_set("memory_limit", "512M");
     $imaging = \Yii::$app->imaging;
     if (!$imaging) {
         //TODO: можно добавить проверку YII ensure...
         throw new \yii\base\Exception("Component Imaging not found");
     }
     $newFileSrc = \Yii::$app->request->getPathInfo();
     $extension = Imaging::getExtension($newFileSrc);
     if (!$extension) {
         throw new \yii\base\Exception("Extension not found: " . $newFileSrc);
     }
     if (!$imaging->isAllowExtension($extension)) {
         throw new \yii\base\Exception("Extension '{$extension}' not supported in Imaging component");
     }
     $newFile = File::object($newFileSrc);
     $strposFilter = strpos($newFileSrc, "/" . Imaging::THUMBNAIL_PREFIX);
     if (!$strposFilter) {
         throw new \ErrorException("This is not a filter thumbnail: " . $newFileSrc);
     }
     $originalFileSrc = substr($newFileSrc, 0, $strposFilter) . "." . $newFile->getExtension();
     $webRoot = \Yii::getAlias('@webroot');
     $originalFileRoot = $webRoot . DIRECTORY_SEPARATOR . $originalFileSrc;
     $newFileRoot = $webRoot . DIRECTORY_SEPARATOR . $newFileSrc;
     $newFileRootDefault = $webRoot . DIRECTORY_SEPARATOR . str_replace($newFile->getBaseName(), Imaging::DEFAULT_THUMBNAIL_FILENAME . "." . $extension, $newFileSrc);
     $originalFile = new File($originalFileRoot);
     if (!$originalFile->isExist()) {
         throw new \ErrorException("The original file is not found: " . $newFileSrc);
     }
     //Проверено наличие оригинального файла, есть пути к оригиналу, и результирующему файлу.
     //Отслось собрать фильтр, и проверить наличие параметров. А так же проверить разрешены ли эти параметры, для этого в строке есть захэшированный ключь
     $filterSting = substr($newFileSrc, $strposFilter + strlen(DIRECTORY_SEPARATOR . Imaging::THUMBNAIL_PREFIX), strlen($newFileSrc));
     $filterCode = explode("/", $filterSting);
     $filterCode = $filterCode[0];
     //Код фильтра
     //Если указаны парамтры, то ноужно проверить контрольную строчку, и если они не соответствуют ей, то ничего делать не будем
     if ($params = \Yii::$app->request->get()) {
         $pramsCheckArray = explode(DIRECTORY_SEPARATOR, $filterSting);
         if (count($pramsCheckArray) < 3) {
             throw new \yii\base\Exception("the control line not found: " . $newFileSrc);
         }
         $string = $imaging->getParamsCheckString($params);
         if ($pramsCheckArray[1] != $string) {
             throw new \yii\base\Exception("Parameters invalid: " . $newFileSrc);
         }
     }
     $filterClass = str_replace("-", "\\", $filterCode);
     if (!class_exists($filterClass)) {
         throw new \ErrorException("Filter class is not created: " . $newFileSrc);
     }
     /**
      * @var Filter $filter
      */
     $filter = new $filterClass((array) $params);
     if (!is_subclass_of($filter, Filter::className())) {
         throw new \ErrorException("No child filter class: " . $newFileSrc);
     }
     try {
         //Проверяем а создан ли уже файл, и если да то просто делаем на него ссылку.
         $filter->setOriginalRootFilePath($originalFileRoot)->setNewRootFilePath($newFileRootDefault)->save();
         if (PHP_OS === 'Windows') {
             if ($newFileRoot != $newFileRootDefault) {
                 //Не тестировалось
                 copy($newFileRootDefault, $newFileRoot);
             }
         } else {
             if ($newFileRoot != $newFileRootDefault) {
                 symlink($newFileRootDefault, $newFileRoot);
             }
         }
         $url = \Yii::$app->request->getUrl() . ($params ? "" : '?sx-refresh');
         /*Header("HTTP/1.0 200 OK");
           Image::getImagine()->open($newFileRootDefault)->show('png');
           return '';*/
         return \Yii::$app->response->redirect($url, 302);
     } catch (\Exception $e) {
         return $e->getMessage();
     }
 }