Enables users to easily add file uploading and necessary validation rules PHP versions 4 and 5 Copyright 2010, Jose Diaz-Gonzalez Licensed under The MIT License Redistributions of files must retain the above copyright notice.
상속: extends ModelBehavior
예제 #1
0
파일: upload.php 프로젝트: neggiel/senju
	function url($data, $field, $options = array())
	{
		$options += array('style' => 'original', 'urlize' => true);
		list($model, $field) = explode('.', $field);
		if(is_array($data))
		{
			if(isset($data[$model]))
			{
				if(isset($data[$model]['id']))
				{
					$id = $data[$model]['id'];
					$filename = $data[$model][$field.'_file_name'];
				}
			}
			elseif(isset($data['id']))
			{
				$id = $data['id'];
				$filename = $data[$field.'_file_name'];
			}
		}

		if(isset($id) && isset($filename))
		{
			$settings = UploadBehavior::interpolate($model, $id, $field, $filename, $options['style'], array('webroot' => ''));
			$url = isset($settings['url']) ? $settings['url'] : $settings['path'];
		}
		else
		{
			$settings = UploadBehavior::interpolate($model, null, $field, null, $options['style'], array('webroot' => ''));
			$url = isset($settings['default_url']) ? $settings['default_url'] : null;
		}

		return $options['urlize'] ? $this->Html->url($url) : $url;
	}
 protected function _prepareFilesForDeletion(Model $model, $field, $data, $options = array())
 {
     if (!empty($this->settings[$model->alias][$field]['saveFullPath'])) {
         $fieldData = $data[$model->alias][$field];
         $dir = $model->__getFolderContainFile($fieldData);
         $data[$model->alias][$options['fields']['dir']] = $dir;
     }
     return parent::_prepareFilesForDeletion($model, $field, $data, $options);
 }
예제 #3
0
 public function url($data, $field, $style = 'original', $urlize = true)
 {
     list($model, $field) = explode('.', $field);
     if (is_array($data)) {
         if (isset($data[$model])) {
             if (isset($data[$model]['id'])) {
                 $id = $data[$model]['id'];
                 $filename = $data[$model][$field];
             }
         } elseif (isset($data['id'])) {
             $id = $data['id'];
             $filename = $data[$field];
         }
     }
     if (isset($id) && isset($filename)) {
         $settings = UploadBehavior::interpolate($model, $id, $field, $filename, $style, array('webroot' => ''));
         $url = isset($settings['url']) ? $settings['url'] : $settings['path'];
     } else {
         $settings = UploadBehavior::interpolate($model, null, $field, null, $style, array('webroot' => ''));
         $url = isset($settings['default_url']) ? $settings['default_url'] : null;
     }
     return $urlize ? $this->Html->url($url) : $url;
 }
예제 #4
0
 /**
  * beforeProcessUpload method
  *
  * Add width and height to the data to be saved
  *
  * @param mixed $model
  * @param mixed $data
  * @return void
  * @access protected
  */
 function _beforeProcessUpload(&$model, &$data)
 {
     parent::_beforeProcessUpload($model, $data);
     extract($this->settings[$model->alias]);
     list($width, $height) = getimagesize($data[$model->alias]['tempFile']);
     $data[$model->alias]['width'] = $width;
     $data[$model->alias]['height'] = $height;
     return !$this->errors;
 }
예제 #5
0
 private function _resize($srcFile, $destFile, $geometry, $quality = 75, $alpha = false)
 {
     copy($srcFile, $destFile);
     @chmod($destFile, 0777);
     $pathinfo = UploadBehavior::_pathinfo($srcFile);
     $src = null;
     $createHandler = null;
     $outputHandler = null;
     switch (strtolower($pathinfo['extension'])) {
         case 'gif':
             $createHandler = 'imagecreatefromgif';
             $outputHandler = 'imagegif';
             break;
         case 'jpg':
         case 'jpeg':
             $createHandler = 'imagecreatefromjpeg';
             $outputHandler = 'imagejpeg';
             break;
         case 'png':
             $createHandler = 'imagecreatefrompng';
             $outputHandler = 'imagepng';
             $quality = null;
             break;
         default:
             return false;
     }
     if ($src = $createHandler($destFile)) {
         $srcW = imagesx($src);
         $srcH = imagesy($src);
         // determine destination dimensions and resize mode from provided geometry
         if (preg_match('/^\\[[\\d]+x[\\d]+\\]$/', $geometry)) {
             // resize with banding
             list($destW, $destH) = explode('x', substr($geometry, 1, strlen($geometry) - 2));
             $resizeMode = 'band';
         } elseif (preg_match('/^[\\d]+x[\\d]+$/', $geometry)) {
             // cropped resize (best fit)
             list($destW, $destH) = explode('x', $geometry);
             $resizeMode = 'best';
         } elseif (preg_match('/^[\\d]+w$/', $geometry)) {
             // calculate heigh according to aspect ratio
             $destW = (int) $geometry - 1;
             $resizeMode = false;
         } elseif (preg_match('/^[\\d]+h$/', $geometry)) {
             // calculate width according to aspect ratio
             $destH = (int) $geometry - 1;
             $resizeMode = false;
         } elseif (preg_match('/^[\\d]+l$/', $geometry)) {
             // calculate shortest side according to aspect ratio
             if ($srcW > $srcH) {
                 $destW = (int) $geometry - 1;
             } else {
                 $destH = (int) $geometry - 1;
             }
             $resizeMode = false;
         }
         if (!isset($destW)) {
             $destW = $destH / $srcH * $srcW;
         }
         if (!isset($destH)) {
             $destH = $destW / $srcW * $srcH;
         }
         // determine resize dimensions from appropriate resize mode and ratio
         if ($resizeMode == 'best') {
             // "best fit" mode
             if ($srcW > $srcH) {
                 if ($srcH / $destH > $srcW / $destW) {
                     $ratio = $destW / $srcW;
                 } else {
                     $ratio = $destH / $srcH;
                 }
             } else {
                 if ($srcH / $destH < $srcW / $destW) {
                     $ratio = $destH / $srcH;
                 } else {
                     $ratio = $destW / $srcW;
                 }
             }
             $resizeW = $srcW * $ratio;
             $resizeH = $srcH * $ratio;
         } elseif ($resizeMode == 'band') {
             // "banding" mode
             if ($srcW > $srcH) {
                 $ratio = $destW / $srcW;
             } else {
                 $ratio = $destH / $srcH;
             }
             $resizeW = $srcW * $ratio;
             $resizeH = $srcH * $ratio;
         } else {
             // no resize ratio
             $resizeW = $destW;
             $resizeH = $destH;
         }
         $img = imagecreatetruecolor($destW, $destH);
         if ($alpha === true) {
             switch (strtolower($pathinfo['extension'])) {
                 case 'gif':
                     $alphaColor = imagecolortransparent($src);
                     imagefill($img, 0, 0, $alphaColor);
                     imagecolortransparent($img, $alphaColor);
                     break;
                 case 'png':
                     imagealphablending($img, false);
                     imagesavealpha($img, true);
                     break;
                 default:
                     imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
                     break;
             }
         } else {
             imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
         }
         imagecopyresampled($img, $src, ($destW - $resizeW) / 2, ($destH - $resizeH) / 2, 0, 0, $resizeW, $resizeH, $srcW, $srcH);
         $outputHandler($img, $destFile, $quality);
         return true;
     }
     return false;
 }
예제 #6
0
 /**
  * Before save method. Called before all saves
  *
  * Handles setup of file uploads
  *
  * @param Model $model Model instance
  * @param array $options Options passed from Model::save().
  * @return bool
  */
 public function beforeSave(Model $model, $options = array())
 {
     CakeLog::debug('NcUploadBehavior::beforeSave()');
     CakeLog::debug('NcUploadBehavior::beforeSave() $this->settings=' . print_r($this->settings, true));
     CakeLog::debug('NcUploadBehavior::beforeSave() $model->data=' . print_r($model->data, true));
     $fields = array_keys($this->settings[$model->alias]);
     foreach ($fields as $field) {
         if (isset($model->data[$field]['File']['path']) && $model->data[$field]['File']['path'] !== '') {
             $newPath = $this->__realPath($model->data[$field]['File']['path']);
             //CakeLog::debug('NcUploadBehavior::beforeSave() $newPath=' . print_r($newPath, true));
             //CakeLog::debug('NcUploadBehavior::beforeSave() $model->data[\'File\'][\'path\']=' . print_r($model->data['File']['path'], true));
             $this->uploadSettings($model, $field, 'path', $newPath);
             $this->uploadSettings($model, $field, 'thumbnailPath', $newPath);
         }
     }
     return parent::beforeSave($model, $options);
 }
예제 #7
0
 /**
  * This callback method is called after saving the image.
  *
  * @param model &$model  instance of model
  * @param array $created data
  *
  * @return boolean
  */
 function afterSave(&$model, $created)
 {
     // Behavior settings for current model
     $settings = $this->settings[$model->name];
     // No need to proceed further if behavior is disabled
     if (!$settings['enabled']) {
         return;
     }
     parent::afterSave($model, $created);
     /*$modelName = $model->name;
       switch ($modelName) {
           case 'Picture':
               $this->__resizeImagesAfterUpload(
                   array('75:h'),
                   $model, $model->data[$modelName]['filename'],
                   $model->data[$modelName]['dir']
               );
               break;
       }*/
 }
예제 #8
0
 /**
  * Before save method. Called before all saves
  *
  * Handles setup of file uploads
  *
  * @param Model $model Model instance
  * @param array $options Options passed from Model::save().
  * @return bool
  */
 public function beforeSave(Model $model, $options = array())
 {
     $fields = array_keys($this->settings[$model->alias]);
     foreach ($fields as $field) {
         if (isset($model->data[$field]['File']['path']) && $model->data[$field]['File']['path'] !== '') {
             $newPath = $this->__realPath($model->data[$field]['File']['path']);
             $this->uploadSettings($model, $field, 'path', $newPath);
             $this->uploadSettings($model, $field, 'thumbnailPath', $newPath);
         }
     }
     return parent::beforeSave($model, $options);
 }
예제 #9
0
 /**
  * Wrapper method for thumbnail creation
  *
  * @param Model $model The model instance
  * @param string $field The name of the upload field
  * @param string $path The path to the source image
  * @param string $thumbnailPath The path in which to create the thumbnails
  * @throws Exception
  * @return void
  */
 public function createThumbnails(Model $model, $field, $path, $thumbnailPath)
 {
     return parent::_createThumbnails($model, $field, $path, $thumbnailPath);
 }