diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/attach.php | 6 | ||||
-rw-r--r-- | include/photo/photo_driver.php | 16 | ||||
-rw-r--r-- | include/photos.php | 50 |
3 files changed, 58 insertions, 14 deletions
diff --git a/include/attach.php b/include/attach.php index 2bb57722b..96b9c0b44 100644 --- a/include/attach.php +++ b/include/attach.php @@ -588,6 +588,12 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) { $def_extension = '.png'; } + // If we know it's a photo, over-ride the type in case the source system could not determine what it was + + if($is_photo) { + $type = $gis['mime']; + } + $pathname = ''; if($is_photo) { diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php index 5eb1f9113..21431e96f 100644 --- a/include/photo/photo_driver.php +++ b/include/photo/photo_driver.php @@ -309,6 +309,11 @@ abstract class photo_driver { public function save($arr) { + if(! $this->is_valid()) { + logger('attempt to store invalid photo.'); + return false; + } + $p = array(); $p['aid'] = ((intval($arr['aid'])) ? intval($arr['aid']) : 0); @@ -331,6 +336,8 @@ abstract class photo_driver { $p['os_path'] = $arr['os_path']; $p['os_syspath'] = ((array_key_exists('os_syspath',$arr)) ? $arr['os_syspath'] : ''); $p['display_path'] = (($arr['display_path']) ? $arr['display_path'] : ''); + $p['width'] = (($arr['width']) ? $arr['width'] : $this->getWidth()); + $p['height'] = (($arr['height']) ? $arr['height'] : $this->getHeight()); if(! intval($p['imgscale'])) logger('save: ' . print_r($arr,true), LOGGER_DATA); @@ -378,8 +385,8 @@ abstract class photo_driver { dbesc(basename($p['filename'])), dbesc($this->getType()), dbesc($p['album']), - intval($this->getHeight()), - intval($this->getWidth()), + intval($p['height']), + intval($p['width']), (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())), intval($p['os_storage']), intval(strlen($this->imageString())), @@ -409,8 +416,8 @@ abstract class photo_driver { dbesc(basename($p['filename'])), dbesc($this->getType()), dbesc($p['album']), - intval($this->getHeight()), - intval($this->getWidth()), + intval($p['height']), + intval($p['width']), (intval($p['os_storage']) ? dbescbin($p['os_syspath']) : dbescbin($this->imageString())), intval($p['os_storage']), intval(strlen($this->imageString())), @@ -426,6 +433,7 @@ abstract class photo_driver { dbesc($p['deny_gid']) ); } + logger('photo save ' . $p['imgscale'] . ' returned ' . intval($r)); return $r; } diff --git a/include/photos.php b/include/photos.php index c38e2bed4..41a1d18cb 100644 --- a/include/photos.php +++ b/include/photos.php @@ -62,27 +62,52 @@ function photo_upload($channel, $observer, $args) { $ac = $acl->get(); + $width = $height = 0; + + if($args['getimagesize']) { + $width = $args['getimagesize'][0]; + $height = $args['getimagesize'][1]; + } + + $os_storage = 0; + $max_thumb = get_config('system','max_thumbnail',1600); + if($args['os_syspath'] && $args['getimagesize']) { - if($args['getimagesize'][0] > 1600 || $args['getimagesize'][1] > 1600) { + if($args['getimagesize'][0] > $max_thumb || $args['getimagesize'][1] > $max_thumb) { $imagick_path = get_config('system','imagick_convert_path'); if($imagick_path && @file_exists($imagick_path)) { $tmp_name = $args['os_syspath'] . '-001'; - $newsize = photo_calculate_1600_scale($args['getimagesize']); - exec($imagick_path . ' ' . $args['os_syspath'] . ' -resize ' . $newsize . '^ ' . $tmp_name); + $newsize = photo_calculate_scale(array_merge($args['getimagesize'],['max' => $max_thumb])); + $cmd = $imagick_path . ' ' . escapeshellarg(PROJECT_BASE . '/' . $args['os_syspath']) . ' -thumbnail ' . $newsize . ' ' . escapeshellarg(PROJECT_BASE . '/' . $tmp_name); + // logger('imagick thumbnail command: ' . $cmd); + for($x = 0; $x < 4; $x ++) { + exec($cmd); + if(! file_exists($tmp_name)) { + logger('imagick scale failed. Retrying.'); + continue; + } + } + if(! file_exists($tmp_name)) { + logger('imagick scale failed. Abort.'); + return $ret; + } + $imagedata = @file_get_contents($tmp_name); + $filesize = @filesize($args['os_syspath']); @unlink($tmp_name); } else { $imagedata = @file_get_contents($args['os_syspath']); + $filesize = strlen($imagedata); } } else { $imagedata = @file_get_contents($args['os_syspath']); + $filesize = strlen($imagedata); } $filename = $args['filename']; - $filesize = strlen($imagedata); // this is going to be deleted if it exists $src = '/tmp/deletemenow'; $type = $args['getimagesize']['mime']; @@ -188,8 +213,10 @@ function photo_upload($channel, $observer, $args) { if ($max_length > 0) $ph->scaleImage($max_length); - $width = $ph->getWidth(); - $height = $ph->getHeight(); + if(! $width) + $width = $ph->getWidth(); + if(! $height) + $height = $ph->getHeight(); $smallest = 0; @@ -203,6 +230,7 @@ function photo_upload($channel, $observer, $args) { $p = array('aid' => $account_id, 'uid' => $channel_id, 'xchan' => $visitor, 'resource_id' => $photo_hash, 'filename' => $filename, 'album' => $album, 'imgscale' => 0, 'photo_usage' => PHOTO_NORMAL, + 'width' => $width, 'height' => $height, 'allow_cid' => $ac['allow_cid'], 'allow_gid' => $ac['allow_gid'], 'deny_cid' => $ac['deny_cid'], 'deny_gid' => $ac['deny_gid'], 'os_storage' => $os_storage, 'os_syspath' => $args['os_syspath'], @@ -224,14 +252,16 @@ function photo_upload($channel, $observer, $args) { 'rel' => 'alternate', 'type' => 'text/html', 'href' => z_root() . '/photo/' . $photo_hash . '-0.' . $ph->getExt(), - 'width' => $ph->getWidth(), - 'height' => $ph->getHeight() + 'width' => $width, + 'height' => $height ); if(! $r0) $errors = true; unset($p['os_storage']); unset($p['os_syspath']); + unset($p['width']); + unset($p['height']); if(($width > 1024 || $height > 1024) && (! $errors)) $ph->scaleImage(1024); @@ -462,9 +492,9 @@ function photo_upload($channel, $observer, $args) { } -function photo_calculate_1600_scale($arr) { +function photo_calculate_scale($arr) { - $max = 1600; + $max = $arr['max']; $width = $arr[0]; $height = $arr[1]; |