/**
  * Creates a Thumbnail named by md5-hash of the image
  * and its file ending.
  *
  * @param mixed sfFilebasePluginImage $fileinfo
  * @param array $dimensions = array(width, height)
  */
 public function createThumbnail(sfFilebasePluginImage $fileinfo, array $dimensions, $quality, $mime, $preserve_transparency = true)
 {
     // Check cache directory
     if (!$this->filebase->getCacheDirectory()->fileExists()) {
         throw new sfFilebasePluginException(sprintf('Cache directory %s does not exist.', $this->filebase->getCacheDirectory()->getPathname()));
     }
     // Check if original file is writable...
     if (!$fileinfo->fileExists()) {
         throw new sfFilebasePluginException(sprintf('File %s does not exist', $fileinfo->getPathname()));
     }
     if (!$fileinfo->isReadable()) {
         throw new sfFilebasePluginException(sprintf('File %s is write protected.', $fileinfo->getPathname()));
     }
     if (!$this->filebase->getIsSupportedImage($fileinfo)) {
         throw new sfFilebasePluginException(sprintf('File %s is not an image.', $fileinfo));
     }
     if (!$fileinfo->isImage()) {
         throw new sfFilebasePluginException(sprintf('Image format %s is unsupported.', $fileinfo));
     }
     if (!$this->filebase->isInFilebase($fileinfo)) {
         throw new sfFilebasePluginException(sprintf('FilebaseFile %s does not belong to Filebase %s, cannot be deleted due to security issues', $fileinfo->getPathname(), $this->filebase->getPathname()));
     }
     $destination = $this->getThumbnailFileinfo($fileinfo, $dimensions, $mime);
     return new sfFilebasePluginThumbnail($this->imageCopyResampled($fileinfo, $destination, $dimensions, true, $preserve_transparency), $this->filebase, $fileinfo);
 }
 /**
  * Moves an uploaded File to specified Destination.
  * Inclusion and exclusion rules consist of regex-strings,
  * they are used to check the target filenames against them.
  * Exclusion:   Matched filenames throw exceptions.
  * Inclusion:  Matched filenames will be passed as valid filenames.
  *
  * You should wrap this method into a try-catch block because many
  * things can go wrong during or after the upload, so if you upload
  * many files and did not validate them before, this would be a good
  * starting point do to some "low level" validation.
  *
  * $destination can be a string (absolute or relative pathname) or an
  * instance of sfFilebasePluginFile, it is the directory, not the full pathName of
  * the new file. The file can be renamed by setting $file_name, otherwise
  * the original name will be taken as filename.
  *
  * @param mixed $tmp_file
  * @param mixed $destination_directory: The directory the file will be moved in.
  * @param boolean $allow_overwrite True if existing files should be overwritten
  * @param array $inclusion_rules
  * @param array $exclusion_rules
  * @param string $file_name: If given, file will be renamed when moving.
  * @throws sfFilebasePluginException
  * @return sfFilebasePluginFile $moved_file
  */
 public function moveUploadedFile(sfFilebasePluginUploadedFile $tmp_file, $destination_directory, $allow_overwrite = true, $chmod = 0777, array $inclusion_rules = array(), $exclusion_rules = array(), $file_name = null)
 {
     $destination_directory = $this->filebase->getFilebaseFile($destination_directory);
     // Error handling
     if ($tmp_file->isError()) {
         switch ($tmp_file->getError()) {
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_EXTENSION:
                 throw new sfFilebasePluginException('Upload error thrown by extension.', sfFilebasePluginUploadedFile::UPLOAD_ERR_EXTENSION);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_PARTIAL:
                 throw new sfFilebasePluginException('Upload error: Upload interrupted.', sfFilebasePluginUploadedFile::UPLOAD_ERR_PARTIAL);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_CANT_WRITE:
                 throw new sfFilebasePluginException('Upload error: Cannot write temporary file.', sfFilebasePluginUploadedFile::UPLOAD_ERR_CANT_WRITE);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_EXTENSION:
                 throw new sfFilebasePluginException('Upload error: Extension error.', sfFilebasePluginUploadedFile::UPLOAD_ERR_EXTENSION);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_FORM_SIZE:
                 throw new sfFilebasePluginException('Upload error: Form size exceeded.', sfFilebasePluginUploadedFile::UPLOAD_ERR_FORM_SIZE);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_INI_SIZE:
                 throw new sfFilebasePluginException('Upload error: Ini size exceeded.', sfFilebasePluginUploadedFile::UPLOAD_ERR_INI_SIZE);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_NO_FILE:
                 throw new sfFilebasePluginException('Upload error: no file was uploaded.', sfFilebasePluginUploadedFile::UPLOAD_ERR_NO_FILE);
             case sfFilebasePluginUploadedFile::UPLOAD_ERR_NO_TMP_DIR:
                 throw new sfFilebasePluginException('Upload error: There is no temp dir.', sfFilebasePluginUploadedFile::UPLOAD_ERR_NO_TMP_DIR);
                 return false;
         }
     }
     // Validation, excuting inclusion rules
     foreach ($inclusion_rules as $rule) {
         if (!preg_match($rule, $tmp_file->getOriginalName())) {
             throw new sfFilebasePluginException(sprintf('Inclusion-Validation failed while uploading file %s: Rule %s', $tmp_file->getOriginalName(), $rule));
         }
     }
     // Valdating using exclusion rules
     foreach ($exclusion_rules as $rule) {
         if (preg_match($rule, $tmp_file->getOriginalName())) {
             throw new sfFilebasePluginException(sprintf('Exclusion-Validation failed while uploading file %s: Rule %s', $tmp_file->getOriginalName(), $rule));
         }
     }
     if (!$destination_directory instanceof sfFilebasePluginDirectory) {
         throw new sfFilebasePluginException(sprintf('Destination %s is not a directory.', $destination_directory->getPathname()));
     }
     $destination = null;
     // Filename given? Rename file...
     if ($file_name === null) {
         $destination = $this->filebase->getFilebaseFile($destination_directory->getPathname() . '/' . $tmp_file->getOriginalName());
     } else {
         $file_name = (string) $file_name;
         if (strlen($file_name > 0)) {
             $destination = $this->filebase->getFilebaseFile($destination_directory->getPathname() . '/' . $file_name);
         }
     }
     if (!$this->filebase->isInFilebase($destination)) {
         throw new sfFilebasePluginException(sprintf('Destination %s does not lie within Filebase %s, access denied due to security reasons.', $destination->getPathname(), $this->filebase->getPathname()));
     }
     if ($destination->fileExists()) {
         if ($allow_overwrite) {
             if (!$destination->isWritable()) {
                 throw new sfFilebasePluginException(sprintf('File %s is write protected.', $destination->getPathname()));
             }
         } else {
             throw new sfFilebasePluginException(sprintf('Destination file %s already exists', $destination->getPathname()));
         }
     } else {
         if (!$destination_directory->isWritable()) {
             throw new sfFilebasePluginException(sprintf('Destination directory %s is write protected', $destination_directory->getPathname()));
         }
     }
     if (!@move_uploaded_file($tmp_file->getTempName(), $destination->getPathname())) {
         throw new sfFilebasePluginException(sprintf('Error while moving uploaded file %s', $tmp_file->getOriginalName()));
     }
     $destination->chmod($chmod);
     return $destination;
 }
 /**
  * Returns true if this file lies within the
  * filebase's directory.
  * @return boolean
  */
 public function getIsInFilebase()
 {
     return $this->filebase->isInFilebase($this);
 }