X-Git-Url: http://git.roojs.org/?p=Pman.Core;a=blobdiff_plain;f=DataObjects%2FImages.php;h=93d7f04efc149abd228a9daacb9210c99a1dce60;hp=f53d1fdb8c0c1dea525d985d1e1dd923d115d1fa;hb=HEAD;hpb=7b3e3c378b00f04e4f50356e53d89a8605ecec38 diff --git a/DataObjects/Images.php b/DataObjects/Images.php index f53d1fdb..d866e481 100644 --- a/DataObjects/Images.php +++ b/DataObjects/Images.php @@ -2,7 +2,7 @@ /** * Table Definition for Images */ -require_once 'DB/DataObject.php'; +class_exists('DB_DataObject') ? '' : require_once 'DB/DataObject.php'; class Pman_Core_DataObjects_Images extends DB_DataObject { @@ -29,6 +29,24 @@ class Pman_Core_DataObjects_Images extends DB_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + function applyFilters($q, $au, $roo) + { + $tn = $this->tableName(); + + if(!empty($q['search']['filename'])){ + $this->whereAdd(" + $tn.filename LIKE '%{$this->escape($q['search']['filename'])}%' OR $tn.title LIKE '%{$this->escape($q['search']['filename'])}%' + "); + } + + if(!empty($q['_to_base64']) && !empty($q['image_id'])) { + $i = DB_DataObject::factory("Images"); + $i->get($q['image_id']); + $roo->jok($i->toBase64()); + } + + + } function checkPerm($lvl, $au) { @@ -41,7 +59,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject $o = $this->object(); //print_r($o); - if (method_exists($o, 'checkPerm')) { + if ($o && method_exists($o, 'checkPerm')) { // edit permissions on related object needed... return $o->checkPerm( $lvl == 'S' ? 'S' : 'E' , $au); @@ -106,6 +124,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject { // copy the file into the storage area.. if (!file_exists($file) || !filesize($file)) { + $this->err = "File $file did not exist or is 0 size"; return false; } @@ -117,9 +136,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject $this->mimetype = $y->fromFilename($filename); } - $this->mimetype= strtolower($this->mimetype); + $this->mimetype = strtolower($this->mimetype); - if (array_shift(explode('/', $this->mimetype)) == 'image') { + $mta = explode('/', $this->mimetype); + if (array_shift($mta) == 'image') { $imgs = @getimagesize($file); @@ -130,6 +150,10 @@ class Pman_Core_DataObjects_Images extends DB_DataObject } } + if($this->mimetype == 'application/pdf'){ + $this->no_of_pages = $this->getPdfPages($file); + } + $this->filesize = filesize($file); $this->created = date('Y-m-d H:i:s'); @@ -177,35 +201,128 @@ class Pman_Core_DataObjects_Images extends DB_DataObject * @return - target file name */ function getStoreName() + { + return self::staticGetStoreName($this); + + } + + static function staticGetStoreName($o) { $opts = HTML_FlexyFramework::get()->Pman; - $fn = preg_replace('/[^a-z0-9\.]+/i', '_', $this->filename); + $fn = preg_replace('/[^a-z0-9\.]+/i', '_', $o->filename); return implode( '/', array( - $opts['storedir'], '_images_', date('Y/m', strtotime($this->created)), $this->id . '-'. $fn + $opts['storedir'], '_images_', date('Y/m', strtotime($o->created)), $o->id . '-'. $fn )); - } - + + /** + * does the files exist? + */ + function exists() + { + return self::staticExists($this); + } + + static function staticExists($o) + { + clearstatcache(); + $ret = file_exists(self::staticGetStoreName($o)); + if (!$ret) { + return self::staticCanFix($o); + } + return $ret; + } + + /** + * the getStorename code got changed, and some old files may not end up with the correct name anymore. + * this tries to fix it. + * + */ + function canFix() + { + return self::staticCanFix($this); + } + + static function staticCanFix($o) + { + // look for the image in the folder, with matching id. + // this is problematic.. + $fn = self::staticGetStoreName($o); + if (file_exists($fn . '-really-missing')) { + return false; + } + if (!file_exists(dirname($fn))) { + return false; + } + foreach( scandir(dirname($fn)) as $n) { + if (empty($n) || $n[0] == '.') { + continue; + } + $bits = explode('-', $n); + if ($bits[0] != $o->id) { + continue; + } + if (preg_match('/\.[0-9]+x[0-9]]+\.jpeg$/', $n)) { + continue; + } + copy(dirname($fn). '/'. $n, $fn); + clearstatcache(); + return true; + } + // fixme - flag it as bad + touch($fn . '-really-missing'); + } + + /** * deletes all the image instances of it... * * */ - function beforeDelete() + function beforeDelete($dependants_array, $roo) { + + if (!empty($dependants_array)) { + return; + } + + $opts = HTML_FlexyFramework::get()->Pman; + $deldir = $opts['storedir']. '/_deleted_images_'; + clearstatcache(); + if (!file_exists( $deldir )) { + @mkdir($deldir, 0755); // not sure why we are erroring here.. after checking - maybe permissions? + } + $fn = $this->getStoreName(); + $b = basename($fn); + clearstatcache(); if (file_exists($fn)) { - unlink($fn); + + if (file_exists($deldir . '/'. $b)) { + unlink($fn); + } else { + rename($fn, $deldir .'/'. $b); + } + + } // delete thumbs.. - $b = basename($fn); + $d = dirname($fn); if (file_exists($d)) { $dh = opendir($d); while (false !== ($fn = readdir($dh))) { if (substr($fn, 0, strlen($b)) == $b) { - unlink($d. '/'. $fn); + clearstatcache(); + if (file_exists($deldir . '/'. $fn)) { + unlink($d. '/'. $fn); + continue; + } + if (file_exists($d. '/'. $fn)) { + rename($d. '/'. $fn, $deldir .'/'. $fn); + } + } } } @@ -240,6 +357,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject return false; } if ($tbl->$fld) { + HTML_FlexyFramework::get()->page->jerr("updating images is disabled"); + exit; $image = DB_DataObject::factory('Images'); $image->get($tbl->$fld); $image->beforeDelete(); @@ -263,18 +382,40 @@ class Pman_Core_DataObjects_Images extends DB_DataObject // direct via roo... /// ctrl not used?? - function onUpload($roo) + function onUpload($roo, $table = false, $file = false) { + + if ($table !== false) { + $this->ontable = $table->tableName(); + $this->onid = $table->pid(); + } + + if ($file === false) { + $file = isset($_FILES['imageUpload']) ? $_FILES['imageUpload'] : array(); + } + //print_r($_FILES); echo $_FILES['imageUpload']['type'];exit; - if (empty($_FILES['imageUpload']['tmp_name']) || - empty($_FILES['imageUpload']['name']) || - empty($_FILES['imageUpload']['type']) + if (empty($file['tmp_name']) || + empty($file['name']) || + empty($file['type']) ) { - $this->err = "Missing file details"; + + $emap = array( + 0=>"There is no error, the file uploaded with success", + 1=>"The uploaded file exceeds the upload_max_filesize directive in php.ini", + 2=>"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" , + 3=>"The uploaded file was only partially uploaded", + 4=>"No file was uploaded", + 6=>"Missing a temporary folder" + ); + $estr = (empty($file['error']) ? '?': $emap[$file['error']]); + $this->err = "Missing file details : Error=". $estr; return false; } if ($this->id) { + HTML_FlexyFramework::get()->page->jerr("updating images is disabled"); + exit; $this->beforeDelete(); } if ( empty($this->ontable)) { @@ -291,6 +432,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject $img->find(); while ($img->fetch()) { + HTML_FlexyFramework::get()->page->jerr("updating images is disabled"); + exit; $img->beforeDelete(); $img->delete(); } @@ -301,7 +444,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject require_once 'File/MimeType.php'; $y = new File_MimeType(); - $this->mimetype = $_FILES['imageUpload']['type']; + $this->mimetype = $file['type']; if (in_array($this->mimetype, array( 'text/application', 'application/octet-stream', @@ -311,7 +454,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject 'application/vnd.ms-excel', /// sometimes windows reports csv as excel??? 'application/csv-tab-delimited-table', // windows again!!? ))) { // weird tyeps.. - $inf = pathinfo($_FILES['imageUpload']['name']); + $inf = pathinfo($file['name']); $this->mimetype = $y->fromExt($inf['extension']); } @@ -319,11 +462,12 @@ class Pman_Core_DataObjects_Images extends DB_DataObject $ext = $y->toExt(trim((string) $this->mimetype )); $this->filename = empty($this->filename) ? - $_FILES['imageUpload']['name'] : ($this->filename .'.'. $ext); + $file['name'] : ($this->filename .'.'. $ext); - if (!$this->createFrom($_FILES['imageUpload']['tmp_name'])) { + if (!$this->createFrom($file['tmp_name'])) { + $this->err = isset($this->err) ? $this->err : "createFrom Image failed"; return false; } return true; @@ -390,20 +534,22 @@ class Pman_Core_DataObjects_Images extends DB_DataObject } - function toRooArray($req = array()) { - // echo '
';print_r($req);exit;
+    function toRooArray($req)
+    {
+        
         $ret= $this->toArray();
       
-        static $ff = false;
-        if (!$ff) {
-            $ff = HTML_FlexyFramework::get();
-        }
+         
+        $ff = HTML_FlexyFramework::get();
+        
         
         $ret['public_baseURL'] = isset($ff->Pman_Images['public_baseURL']) ?
                     $ff->Pman_Images['public_baseURL'] : $ff->baseURL;
         
         if (!empty($req['query']['imagesize'])) {
-             $baseURL = isset($req['query']['imageBaseURL']) ? $req['query']['imageBaseURL'] : false;
+            // query/imageBaseURL ... depricated...? -- set it in config?
+            
+            $baseURL = isset($req['query']['imageBaseURL']) ? $req['query']['imageBaseURL'] : $ret['public_baseURL'];
             
             $ret['url'] = $this->URL(-1, '/Images/Download',$baseURL);
             
@@ -412,10 +558,11 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             if (!empty($req['query']['imagesize'])) {
                 $ret['url_thumb'] = $this->URL($req['query']['imagesize'], '/Images/Thumb',$baseURL);
             }
+            
+            
         }
+        $ret['shorten_name']   = $this->shorten_name();
         
-         
-         
         return $ret;
     }
     
@@ -426,13 +573,17 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
      * 
      * 
      */
-    function URL($size , $provider = '/Images/Thumb', $baseURL=false)
+    function URL($size , $provider = '/Images/Thumb', $baseURL=false, $to_type=false)
     {
         if (!$this->id) {
             return 'about:blank';
-            
         }
-
+        if (!$this->exists()) {
+            return 'about:missing';
+        }
+        
+        $shorten_name = $this->shorten_name();
+        
         $ff = HTML_FlexyFramework::get();
         $baseURL = $baseURL ? $baseURL : $ff->baseURL ;
         if (preg_match('#^http[s]*://#', $provider)) {
@@ -442,36 +593,88 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         if ($size < 0) {
             $provider = preg_replace('#/Thumb$#', '', $provider);
             
-            return $baseURL . $provider . "/{$this->id}/{$this->filename}";
+            return $baseURL . $provider . "/{$this->id}/{$shorten_name}"; // -- this breaks the rss feed #image-{$this->id}";
         }
         //-- max?
         //$size = max(100, (int) $size);
         //$size = min(1024, (int) $size);
         // the size should 200x150 to convert
         $sizear = preg_split('/(x|c)/', $size);
-        if(empty($sizear[1])){
-            $sizear[1] = 0;
+        if(!isset($sizear[1])){
+            $sizear[1] =   0; // 0x with '0' is a box? why
         }
+        
         $size = implode(strpos($size,'c') > -1 ? 'c' : 'x', $sizear);
 //        print_r($size);
         $fc = $this->toFileConvert();
 //        print_r($size);
 //        exit;
-        $mt = $this->mimetype;
+        $mt = $to_type === false ? $this->mimetype : $to_type;
         if (!preg_match('#^image/#i',$mt)) {
             $mt = 'image/jpeg';
         }
         
-        $fc->convert($mt, $size);
+        $cn = $fc->convert($mt, $size);
+        $shorten_name = $this->shorten_name(basename($cn));
+        
+        return $baseURL . $provider . "/$size/{$this->id}/{$shorten_name}"; // -- this breaks the rss feed #image-{$this->id}";
+    }
+    /**
+     *
+     * tries to get an image from then URL - not always has based... - also from the normal url
+     */
+    function getFromHashURL($url)
+    {
+        $id = false;
+        if (preg_match('/#image-([0-9]+)$/', $url, $matches)) {
+            $id = $matches[1];
+        } else if (preg_match('#Images/Thumb/[^/]+/([0-9]+)/#', $url, $matches)) {
+            $id = $matches[1];
+        } else if (preg_match('#Images/([0-9]+)/#', $url, $matches)) {
+            $id = $matches[1];
+        } else if (preg_match('#images[^/]+/([0-9]+)/#i', $url, $matches)) {
+            // supports images.xxxxx.com/{number}/name...
+            $id = $matches[1];
+        } else if (preg_match('#Thumb/[^/]+/([0-9]+)/#', $url, $matches)) {
+            $id = $matches[1];
+        }
+        if ($id === false ||  $id < 1) {
+            return false;
+        }
+        
+        $img = DB_DAtaObject::Factory('images');
+        if ($img->get($id)) {
+            return $img;
+        }
+        return false;
+    }
+    
+    
+    function shorten_name($fn = false)
+    {
+        if(empty($this->filename)) {
+            return;
+        }
+        $fn = $fn === false ? $this->filename : $fn;
+        
+        $filename = explode('.', $fn);
+        $ext = array_pop($filename);
+        $name = preg_replace("/[^A-Z0-9.]+/i", '-', implode('-', $filename)) ;
         
-        return $baseURL . $provider . "/$size/{$this->id}/{$this->filename}";
+        if(strlen($name) > 32) {
+            $name = substr($name, 0, 32);
+        }
+        
+        $shorten_name = "{$name}.{$ext}";
+        
+        return $shorten_name;
     }
     /**
      * size could be 123x345
      * 
      * 
      */
-    function toHTML($size, $provider = '/Images/Thumb') 
+    function toHTML($size, $provider = '/Images/Thumb', $extra = '') 
     {
         
         
@@ -486,12 +689,12 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         }
         if (empty($sz[1])) {
             $ratio =  empty($this->width) ? 1 : $this->height/ ($this->width *1.0);
-            $sy = $ratio * $sx;
+            $sy = intval($ratio * $sx);
         } else {
             $sy = $sz[1];
         }
         // create it?
-        $extra = '';
+       
         if (strlen($this->title)) {
             $extra = ' title="'. htmlspecialchars($this->title) . '"';
         }
@@ -530,6 +733,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
      */
     function toFileConvert()
     {
+        $fn = $this->getStoreName();
+        
         require_once 'File/Convert.php';
         $fc = new File_Convert($this->getStoreName(), $this->mimetype);
         return $fc;
@@ -582,11 +787,12 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             $roo->addEvent("ADD", $this, $this->toEventString());
             
             $r = DB_DataObject::factory($this->tableName());
+            
             $r->id = $this->id;
             $roo->loadMap($r);
             $r->limit(1);
             $r->find(true);
-            $roo->jok($r->toArray());
+            $roo->jok($r->toRooArray($ar));
             
             
         }
@@ -601,8 +807,7 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         if (!$this->checkPerm($this->id ? 'A' : 'E', $roo->authUser))  {
             $roo->jerr("IMAGE UPLOAD PERMISSION DENIED");
         }
-        
-        
+         
         
         if (!isset($_FILES['imageUpload'])) {
             return; // standard update...
@@ -612,20 +817,25 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
 //        print_r(!$this->onUpload($this));
         
         if ( !$this->onUpload($this)) { 
-            $roo->jerr("File upload failed : ". (!empty($this->err) ? $this->err : ''));
+            $roo->jerr("File upload failed : error = ". (!empty($this->err) ? $this->err : ''));
         }
         
-        $roo->addEvent("ADD", $this, $this->toEventString());
+        $this->addEvent($ar, $roo);
         
         $r = DB_DataObject::factory($this->tableName());
         $r->id = $this->id;
         $roo->loadMap($r);
         $r->limit(1);
         $r->find(true);
-        $roo->jdata($r);
+        $roo->jok($r->toRooArray($ar));
          
     }
     
+    function addEvent($ar, $roo)
+    {
+        $roo->addEvent("ADD", $this, $this->toEventString());
+    }
+    
     function toEventString()
     {
         
@@ -647,6 +857,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         }
         
         if ($this->id) {
+            HTML_FlexyFramework::get()->page->jerr("updating images is disabled");
+            exit;
             $this->beforeDelete();
         }
         
@@ -664,6 +876,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
             
             $img->find();
             while ($img->fetch()) {
+                HTML_FlexyFramework::get()->page->jerr("updating images is disabled");
+                exit;
                 $img->beforeDelete();
                 $img->delete();
             }
@@ -688,7 +902,8 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         
         $ext = $y->toExt(trim((string) $this->mimetype ));
         
-        if(array_pop(explode('.', $this->filename)) != $ext){
+        $explode_filename = explode('.', $this->filename);
+        if(array_pop($explode_filename) != $ext){
             $this->filename = $this->filename .'.'. $ext; 
         }
         
@@ -703,11 +918,31 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
     function createFromData($data)
     {   
         
-        $this->mimetype= strtolower($this->mimetype);
+        if (0 === strpos($data, "data:")) {
+            // data:image/png;base64, 
+            $data = substr($data,5);
+            $bits = explode(";", $data);
+            $this->mimetype = $bits[0];
+        }
+        static $imgid = 1;
+        if (empty($this->filename)) {
+            require_once 'File/MimeType.php';
+            $y = new File_MimeType();
+            $this->filename = 'image-'.$imgid++.'.'.$y->toExt($this->mimetype);
+        }
+        
+        
+        $this->mimetype = strtolower($this->mimetype);
+        if ($this->mimetype == 'image/jpg') {
+            $this->mimetype = 'image/jpeg';
+        }
         
-        if (array_shift(explode('/', $this->mimetype)) == 'image') { 
         
-            $imgs = @getimagesize($data);
+        $explode_mimetype = explode('/', $this->mimetype);
+        
+        if (array_shift($explode_mimetype) == 'image') { 
+        
+            $imgs = @getimagesize('data://'. $data);
             
             if (!empty($imgs) && !empty($imgs[0]) && !empty($imgs[1])) {
                 list($this->width , $this->height)  = $imgs;
@@ -731,15 +966,119 @@ class Pman_Core_DataObjects_Images extends DB_DataObject
         }
         
         file_put_contents($f, file_get_contents("data://" . $data));
-        
+        //var_dump($f);exit;
         $o = clone($this);
         
         $this->filesize = filesize($f);
         
+        if($this->mimetype == 'application/pdf'){
+            $this->no_of_pages = $this->getPdfPages($f);
+        }
+        
         $this->update($o);
         
         return true;
         
     }
     
+    function toBase64($rotate = false, $scaleWidth = 0, $scaleHeight = 0)
+    {
+        if(!preg_match('/^image\//', $this->mimetype)){
+            return false;
+        }
+        
+        $file = $this->getStoreName();
+
+        if(!file_exists($file)){
+            return false;
+        }
+        
+        $data = file_get_contents($file);
+        
+        if(!empty($scaleWidth) || !empty($scaleHeight)){
+            $data = $this->scale(false, $scaleWidth, $scaleHeight);
+        }
+        
+        if($rotate){
+            $data = $this->rotate($data);
+        }
+        
+        $base64 = 'data:' . $this->mimetype . ';base64,' . base64_encode($data);
+        
+        return $base64;
+    }
+    
+    function getPdfPages($file)
+    {
+        require_once 'System.php';
+        
+        $page = 0;
+
+        $pdfinfo = System::which('pdfinfo');
+
+        if (!file_exists($file) || empty($pdfinfo)) {
+            return $page;
+        }
+        
+        $cmd = "{$pdfinfo} {$file}";
+
+        $ret = `$cmd`;
+
+        $info = explode("\n", $ret);
+
+        foreach ($info as $i){
+
+            if(!preg_match('/^Pages:[\s]*([0-9]+)/', $i, $matches)){
+                continue;
+            }
+            
+            $page = (empty($matches[1])) ? 0 : $matches[1];
+        }
+        
+        return $page;
+    }
+    
+    function rotate($imageBlob = false)
+    {
+        if(empty($imageBlob)){
+            $imagick = new Imagick($this->getStoreName());
+        } else {
+            $imagick = new Imagick();
+            $imagick->readImageBlob($imageBlob);
+        }
+        
+        $orientation = $imagick->getImageOrientation(); 
+        
+        switch($orientation) { 
+            case Imagick::ORIENTATION_BOTTOMRIGHT: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), 180); // rotate 180 degrees 
+            break; 
+
+            case Imagick::ORIENTATION_RIGHTTOP: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), 90); // rotate 90 degrees CW 
+            break; 
+
+            case Imagick::ORIENTATION_LEFTBOTTOM: 
+                $imagick->rotateimage(new ImagickPixel('#00000000'), -90); // rotate 90 degrees CCW 
+            break; 
+        }
+        
+        return $imagick->getImageBlob();
+    }
+    
+    function scale($imageBlob = false, $width = 0, $height = 0)
+    {
+        if(empty($imageBlob)){
+            $imagick = new Imagick($this->getStoreName());
+        } else {
+            $imagick = new Imagick();
+            $imagick->readImageBlob($imageBlob);
+        }
+        
+        $imagick->resizeimage($width, $height, Imagick::FILTER_LANCZOS, true, true);
+        
+        return $imagick->getImageBlob();
+        
+    }
+    
  }