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