/** * 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); }