예제 #1
0
파일: File.php 프로젝트: piratevn/cms-gio
 public function uploadAction()
 {
     $this->disableLayout();
     $this->setNoRender();
     $request = $this->getRequest();
     if (!$request->isPost()) {
         exit;
     }
     /**
      * Authentication
      */
     $phpSessionId = $request->getPost('PHPSESSID');
     $session = Gio_Core_Session::getSessionById($phpSessionId);
     $json = new Services_JSON();
     $user = null == $session || null == $session['data'] ? null : $json->decode($session['data']);
     if (null == $user) {
         return;
     }
     /**
      * Get config
      */
     $configFile = MOD_DIR . DS . 'upload' . DS . 'configs' . DS . 'config.ini';
     $iniArray = @parse_ini_file($configFile, true);
     $tool = isset($iniArray['thumbnail']['tool']) ? $iniArray['thumbnail']['tool'] : 'gd';
     $sizes = array();
     foreach ($iniArray['size'] as $key => $value) {
         list($method, $width, $height) = explode('_', $value);
         $sizes[$key] = array('method' => $method, 'width' => $width, 'height' => $height);
     }
     $user = (array) $user;
     $userName = $user['username'];
     $module = $request->getPost('mod');
     $thumbnailSizes = $request->getPost('thumbnails', null);
     /**
      * Prepare folders
      */
     $dir = ROOT_DIR . DS . 'upload';
     $path = implode(DS, array($module, $userName, date('Y'), date('m')));
     Gio_Core_File::createDirs($dir, $path);
     /**
      * Upload file
      */
     $ext = explode('.', $_FILES['Filedata']['name']);
     $extension = $ext[count($ext) - 1];
     unset($ext[count($ext) - 1]);
     $fileName = date('YmdHis_') . implode('', $ext);
     $file = $dir . DS . $path . DS . $fileName . '.' . $extension;
     move_uploaded_file($_FILES['Filedata']['tmp_name'], $file);
     /**
      * Water mark
      * @since 2.0.4
      */
     $watermark = $request->getParam('watermark');
     $overlayText = $color = $overlayImage = $position = $sizesApplied = null;
     if ((bool) $watermark) {
         $overlayText = $request->getParam('text');
         $color = $request->getParam('color');
         $overlayImage = $request->getParam('image');
         $position = $request->getParam('position');
         $sizesApplied = $request->getParam('sizes');
         $sizesApplied = explode(',', $sizesApplied);
     }
     /**
      * Generate thumbnails if requested
      */
     if (!isset($thumbnailSizes) || $thumbnailSizes == null) {
         $thumbnailSizes = array_keys($sizes);
     } else {
         if ($thumbnailSizes != 'none') {
             $thumbnailSizes = explode(',', $thumbnailSizes);
         }
     }
     $service = null;
     switch (strtolower($tool)) {
         case 'imagemagick':
             $service = new Gio_Image_ImageMagick();
             break;
         case 'gd':
             $service = new Gio_Image_GD();
             break;
     }
     $ret = array();
     /**
      * Remove script filename from base URL
      */
     $baseUrl = $request->getBaseUrl();
     $prefixUrl = rtrim($baseUrl, '/') . '/upload/' . $module . '/' . $userName . '/' . date('Y') . '/' . date('m');
     $ret['original'] = array('url' => $prefixUrl . '/' . $fileName . '.' . $extension, 'size' => null);
     if ($thumbnailSizes != 'none') {
         $service->setFile($file);
         $ret['original']['size'] = $service->getWidth() . ' x ' . $service->getHeight();
         foreach ($thumbnailSizes as $s) {
             $service->setFile($file);
             $method = $sizes[$s]['method'];
             $width = $sizes[$s]['width'];
             $height = $sizes[$s]['height'];
             $f = $fileName . '_' . $s . '.' . $extension;
             $newFile = $dir . DS . $path . DS . $f;
             /**
              * Create thumbnail
              */
             switch ($method) {
                 case 'resize':
                     $service->resizeLimit($newFile, $width, $height);
                     break;
                 case 'crop':
                     $service->crop($newFile, $width, $height);
                     break;
             }
             /**
              * Create watermark if requested
              */
             if ((bool) $watermark) {
                 $service->setWatermarkFont(ROOT_DIR . DS . 'data' . DS . 'upload' . DS . self::WATERMARK_FONT);
                 $service->setFile($newFile);
                 if ($overlayText && in_array($s, $sizesApplied)) {
                     $service->watermarkText($overlayText, $position, array('color' => $color, 'rotation' => 0, 'opacity' => 50, 'size' => null));
                 }
                 if ($overlayImage && in_array($s, $sizesApplied)) {
                     $overlay = explode('/', $overlayImage);
                     $n = count($overlay);
                     $overlay = implode(DS, array($dir, 'multimedia', $overlay[$n - 4], $overlay[$n - 3], $overlay[$n - 2], $overlay[$n - 1]));
                     $service->watermarkImage($overlay, $position);
                 }
             }
             $ret[$s] = array('url' => $prefixUrl . '/' . $f, 'size' => $width . ' x ' . $height);
         }
     }
     /**
      * Return the reponse
      */
     $json = new Services_JSON();
     $this->getResponse()->setBody($json->encodeUnsafe($ret));
 }