Exemple #1
0
 public function execute(Request $request, WorkingFolder $workingFolder, EventDispatcher $dispatcher, CacheManager $cache, ResizedImageRepository $resizedImageRepository, ThumbnailRepository $thumbnailRepository, Acl $acl)
 {
     $fileName = (string) $request->query->get('fileName');
     $editedImage = new EditedImage($fileName, $this->app);
     $saveAsNew = false;
     if (!$editedImage->exists()) {
         $saveAsNew = true;
         $editedImage->saveAsNew(true);
     } else {
         // If file exists check for FILE_DELETE permission
         $resourceTypeName = $workingFolder->getResourceType()->getName();
         $path = $workingFolder->getClientCurrentFolder();
         if (!$acl->isAllowed($resourceTypeName, $path, Permission::FILE_DELETE)) {
             throw new UnauthorizedException(sprintf('Unauthorized: no FILE_DELETE permission in %s:%s', $resourceTypeName, $path));
         }
     }
     if (!Image::isSupportedExtension($editedImage->getExtension())) {
         throw new InvalidExtensionException('Unsupported image type or not image file');
     }
     $imageFormat = Image::mimeTypeFromExtension($editedImage->getExtension());
     $uploadedData = (string) $request->request->get('content');
     if (null === $uploadedData || strpos($uploadedData, 'data:image/png;base64,') !== 0) {
         throw new InvalidUploadException('Invalid upload. Expected base64 encoded PNG image.');
     }
     $data = explode(',', $uploadedData);
     $data = isset($data[1]) ? base64_decode($data[1]) : false;
     if (!$data) {
         throw new InvalidUploadException();
     }
     try {
         $uploadedImage = Image::create($data);
     } catch (\Exception $e) {
         // No need to check if secureImageUploads is enabled - image must be valid here
         throw new InvalidUploadException('Invalid upload: corrupted image', Error::UPLOADED_CORRUPT, array(), $e);
     }
     $editedImage->setNewContents($uploadedImage->getData($imageFormat));
     $editedImage->setNewDimensions($uploadedImage->getWidth(), $uploadedImage->getHeight());
     if (!$editedImage->isValid()) {
         throw new InvalidUploadException('Invalid file provided');
     }
     $editFileEvent = new EditFileEvent($this->app, $editedImage);
     $imageInfo = $uploadedImage->getInfo();
     $cache->set(Path::combine($workingFolder->getResourceType()->getName(), $workingFolder->getClientCurrentFolder(), $fileName), $uploadedImage->getInfo());
     $dispatcher->dispatch(CKFinderEvent::SAVE_IMAGE, $editFileEvent);
     $saved = false;
     if (!$editFileEvent->isPropagationStopped()) {
         $saved = $editedImage->save($editFileEvent->getNewContents());
         if (!$saved) {
             throw new AccessDeniedException("Couldn't save image file");
         }
         //Remove thumbnails and resized images in case if file is overwritten
         if (!$saveAsNew && $saved) {
             $resourceType = $workingFolder->getResourceType();
             $thumbnailRepository->deleteThumbnails($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
             $resizedImageRepository->deleteResizedImages($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
         }
     }
     return array('saved' => (int) $saved, 'date' => Utils::formatDate(time()), 'size' => Utils::formatSize($imageInfo['size']));
 }
Exemple #2
0
 /**
  * @param Request         $request
  * @param WorkingFolder   $workingFolder
  * @param EventDispatcher $dispatcher
  * @param Acl             $acl
  *
  * @return array
  *
  * @throws \Exception
  */
 public function execute(Request $request, WorkingFolder $workingFolder, EventDispatcher $dispatcher, Acl $acl, ResizedImageRepository $resizedImageRepository, ThumbnailRepository $thumbnailRepository)
 {
     $fileName = (string) $request->get('fileName');
     $newFileName = (string) $request->get('newFileName');
     $editedImage = new EditedImage($fileName, $this->app, $newFileName);
     $resourceType = $workingFolder->getResourceType();
     if (null === $newFileName) {
         $resourceTypeName = $resourceType->getName();
         $path = $workingFolder->getClientCurrentFolder();
         if (!$acl->isAllowed($resourceTypeName, $path, Permission::FILE_DELETE)) {
             throw new UnauthorizedException(sprintf('Unauthorized: no FILE_DELETE permission in %s:%s', $resourceTypeName, $path));
         }
     }
     if (!Image::isSupportedExtension($editedImage->getExtension())) {
         throw new InvalidExtensionException('Unsupported image type or not image file');
     }
     $image = Image::create($editedImage->getContents());
     $actions = (array) $request->get('actions');
     if (empty($actions)) {
         throw new InvalidRequestException();
     }
     foreach ($actions as $actionInfo) {
         if (!isset($actionInfo['action'])) {
             throw new InvalidRequestException('ImageEdit: action name missing');
         }
         switch ($actionInfo['action']) {
             case self::OPERATION_CROP:
                 if (!Utils::arrayContainsKeys($actionInfo, array('x', 'y', 'width', 'height'))) {
                     throw new InvalidRequestException();
                 }
                 $x = $actionInfo['x'];
                 $y = $actionInfo['y'];
                 $width = $actionInfo['width'];
                 $height = $actionInfo['height'];
                 $image->crop($x, $y, $width, $height);
                 break;
             case self::OPERATION_ROTATE:
                 if (!isset($actionInfo['angle'])) {
                     throw new InvalidRequestException();
                 }
                 $degrees = $actionInfo['angle'];
                 $bgcolor = isset($actionInfo['bgcolor']) ? $actionInfo['bgcolor'] : 0;
                 $image->rotate($degrees, $bgcolor);
                 break;
             case self::OPERATION_RESIZE:
                 if (!Utils::arrayContainsKeys($actionInfo, array('width', 'height'))) {
                     throw new InvalidRequestException();
                 }
                 $width = $actionInfo['width'];
                 $height = $actionInfo['height'];
                 $image->resize($width, $height);
                 break;
         }
     }
     $editFileEvent = new EditFileEvent($this->app, $editedImage);
     $editedImage->setNewContents($image->getData());
     $editedImage->setNewDimensions($image->getWidth(), $image->getHeight());
     if (!$editedImage->isValid()) {
         throw new InvalidUploadException('Invalid file provided');
     }
     $dispatcher->dispatch(CKFinderEvent::EDIT_IMAGE, $editFileEvent);
     $saved = false;
     if (!$editFileEvent->isPropagationStopped()) {
         $saved = $editedImage->save($editFileEvent->getNewContents());
         //Remove thumbnails and resized images in case if file is overwritten
         if ($newFileName === null && $saved) {
             $thumbnailRepository->deleteThumbnails($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
             $resizedImageRepository->deleteResizedImages($resourceType, $workingFolder->getClientCurrentFolder(), $fileName);
         }
     }
     return array('saved' => (int) $saved, 'date' => Utils::formatDate(time()));
 }