/** * process any uploads * * @return void * @author Andy Bennett */ public static function upload_listener() { if (!Event::$data instanceof ORM) { throw new Exception('Model not passed to ' . __CLASS__ . '/' . __FUNCTION__); } $model = Event::$data; // do the uploading foreach ($_FILES as $file => $file_data) { if ($file_data['error'] == 0) { $tmp_file = $file_data['tmp_name']; $filename = $file_data['name']; $udata = fileinfo::get($tmp_file, $filename); $udata['file_name'] = filestore::put($file_data, $filename); preview::generate($udata); $n = str_replace('form_', '', $file); $id = (is_object($model->{$n}) and $model->{$n}->id > 0) ? $model->{$n}->id : 0; if (isset($udata['image_width']) && empty($udata['image_width'])) { unset($udata['image_width']); } if (isset($udata['image_height']) && empty($udata['image_height'])) { unset($udata['image_height']); } // if there is preview data set if (is_array($udata['preview'])) { // add the preview data into the upload table $preview = ORM::factory('upload'); foreach ($udata['preview'] as $k => $v) { if ($k == 'preview') { continue; } $preview->{$k} = $v; } $preview->parent_model = $model->object_name; $preview->parent_id = $model->id; $preview->save(); // and assign the id to the row $udata['preview_id'] = $preview->id; } unset($udata['preview']); $o = ORM::factory('upload', $id); if (!$o->loaded) { $o = ORM::factory('upload'); } foreach ($udata as $k => $v) { $o->{$k} = $v; } $o->parent_model = $model->object_name; $o->parent_id = $model->id; $o->save(); // insert the upload into the uploads database // $_POST[$file] = $o->id; $f = str_replace('form_', '', $file); $model->{$f} = $o->id; $model->save(); } } }
/** * get the data about the image * * @param integer $image (optional - if not passed, used uri segment 3) * @return object * @author Andy Bennett */ protected function get_image_row($image = false) { // use URI segment 3 if no id is passed if (!$image) { $image = end(URI::instance()->segment_array()); } // strip any file extensions (actually strip anything that isn't a number) $image = pathinfo(Kohana::instance()->uri->string(), PATHINFO_FILENAME); // make sure the id is numeric - if not exit if (!preg_match('/[0-9]+/i', $image)) { exit; } // get the ORM object $row = ORM::factory($this->setup['model'] . '_upload', $image); // make sure the object has been loaded properly and the parent model matches if (!$row->loaded) { Kohana::log('error', 'File model row error: ' . $image); throw new Kohana_404_Exception($image, 'common/error_404'); } if ($row->parent_model != $this->setup['model']) { Kohana::log('error', 'File model error: ' . $row->id); throw new Kohana_403_Exception($row->id, 'common/error_403'); } // make sure the object's status is true if (!$row->parent->status and !User::instance()->is_moderator()) { Kohana::log('error', 'File status: ' . $row->id); throw new Kohana_403_Exception($row->id, 'common/error_403'); } // $data = array( 'action' => URI::instance()->segment(2), 'name' => $this->setup['name'], 'role' => User::instance()->get_role() ); // Event::run( 'acl.check', $data ); $row->full_path = Kohana::config('upload.directory') . '/' . $row->file_name; if (!file_exists($row->full_path)) { $this->delete_fullpath = $row->full_path; file_put_contents($row->full_path, filestore::get($row->file_name)); } else { if (!file_exists($row->full_path) and isset($row->file_data) and !empty($row->file_data)) { file_put_contents($row->full_path, $row->file_data); } } if (!file_exists($row->full_path)) { Kohana::log('error', 'Invalid file path: ' . $row->full_path); throw new Kohana_404_Exception($row->orig_name, 'common/error_404'); } return $row; }