From 753f58d6a966a1051dcd62a3eeab8fc18798bcac Mon Sep 17 00:00:00 2001 From: rvelices Date: Tue, 27 Dec 2011 05:26:44 +0000 Subject: feature 2541 multisize - core implementation + usage on most public/admin pages - still to do: sync process, upload, gui/persistence for size parameters, migration script, center of interest ... git-svn-id: http://piwigo.org/svn/trunk@12796 68402e56-0260-453c-a942-63ccdbb3a9ee --- i.php | 292 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 i.php (limited to 'i.php') diff --git a/i.php b/i.php new file mode 100644 index 000000000..9f5463601 --- /dev/null +++ b/i.php @@ -0,0 +1,292 @@ +=400) + { + $protocol = $_SERVER["SERVER_PROTOCOL"]; + if ( ('HTTP/1.1' != $protocol) && ('HTTP/1.0' != $protocol) ) + $protocol = 'HTTP/1.0'; + + header( "$protocol $code $msg", true, $code ); + } + //todo improve + echo $msg; + exit; +} + + +function parse_request() +{ + global $conf, $page; + + if ( $conf['question_mark_in_urls']==false and + isset($_SERVER["PATH_INFO"]) and !empty($_SERVER["PATH_INFO"]) ) + { + $req = $_SERVER["PATH_INFO"]; + $req = str_replace('//', '/', $req); + $path_count = count( explode('/', $req) ); + $page['root_path'] = PHPWG_ROOT_PATH.str_repeat('../', $path_count-1); + } + else + { + $req = $_SERVER["QUERY_STRING"]; + /*foreach (array_keys($_GET) as $keynum => $key) + { + $req = $key; + break; + }*/ + $page['root_path'] = PHPWG_ROOT_PATH; + } + + $req = ltrim($req, '/'); + !preg_match('#[^a-zA-Z0-9/_.-]#', $req) or ierror('Invalid chars in request', 400); + + $page['derivative_path'] = PHPWG_ROOT_PATH.PWG_DERIVATIVE_DIR.$req; + + $pos = strrpos($req, '.'); + $pos!== false || ierror('Missing .', 400); + $ext = substr($req, $pos); + $page['derivative_ext'] = $ext; + $req = substr($req, 0, $pos); + + $pos = strrpos($req, '-'); + $pos!== false || ierror('Missing -', 400); + $deriv = substr($req, $pos+1); + $req = substr($req, 0, $pos); + + $deriv = explode('_', $deriv); + foreach (ImageStdParams::get_defined_type_map() as $type => $params) + { + if (substr($type,0,2) == $deriv[0]) + { + $page['derivative_type'] = $type; + $page['derivative_params'] = $params; + break; + } + } + + if (!isset($page['derivative_type'])) + { + if (substr(IMG_CUSTOM,0,2) == $deriv[0]) + { + $page['derivative_type'] = IMG_CUSTOM; + } + else + { + ierror('Unknown parsing type', 400); + } + } + array_shift($deriv); + + $page['coi'] = ''; + if (count($deriv) && $deriv[0][0]=='c' && $deriv[0][1]=='i') + { + $page['coi'] = substr(array_shift($deriv), 2); + preg_match('#^[a-z]{4}$#', $page['coi']) or ierror('Invalid center of interest', 400); + } + + if ($page['derivative_type'] == IMG_CUSTOM) + { + try + { + $page['derivative_params'] = ImageParams::from_url_tokens($deriv); + } + catch (Exception $e) + { + ierror($e->getMessage(), 400); + } + } + + if ($req[0]!='g' && $req[0]!='u') + $req = '../'.$req; + + $page['src_location'] = $req.$ext; + $page['src_path'] = PHPWG_ROOT_PATH.$page['src_location']; + $page['src_url'] = $page['root_path'].$page['src_location']; +} + + + +$page=array(); + +include_once( PHPWG_ROOT_PATH .'/include/derivative_params.inc.php'); +include_once( PHPWG_ROOT_PATH .'/include/derivative_std_params.inc.php'); + +ImageStdParams::load_from_file(); + + +parse_request(); +//var_export($page); + +$params = $page['derivative_params']; +if ($params->sizing->ideal_size[0] < 20 or $params->sizing->ideal_size[1] < 20) +{ + ierror('Invalid size', 400); +} +if ($params->sizing->max_crop < 0 or $params->sizing->max_crop > 1) +{ + ierror('Invalid crop', 400); +} + +$src_mtime = @filemtime($page['src_path']); +if ($src_mtime === false) +{ + ierror('Source not found', 404); +} + +$need_generate = false; +$derivative_mtime = @filemtime($page['derivative_path']); +if ($derivative_mtime === false or + $derivative_mtime < $src_mtime or + $derivative_mtime < $params->last_mod_time) +{ + $need_generate = true; +} + +if (!$need_generate) +{ + if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) + and strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $derivative_mtime) + {// send the last mod time of the file back + header('Last-Modified: '.gmdate('D, d M Y H:i:s', $derivative_mtime).' GMT', true, 304); + header('Expires: '.gmdate('D, d M Y H:i:s', time()+10*24*3600).' GMT', true, 304); + exit; + } + // todo send pass-through +} + + +include_once(PHPWG_ROOT_PATH . 'admin/include/image.class.php'); +$image = new pwg_image($page['src_path']); + +if (!mkgetdir(dirname($page['derivative_path']))) +{ + ierror("dir create error", 500); +} + +$changes = 0; + +// todo rotate + +// Crop & scale +$params->sizing->compute( array($image->get_width(),$image->get_height()), $page['coi'], $crop_rect, $scale_width ); +if ($crop_rect) +{ + $changes++; + $image->crop( $crop_rect->width(), $crop_rect->height(), $crop_rect->l, $crop_rect->t); +} + +if ($scale_width) +{ + $changes++; + $image->resize( $scale_width[0], $scale_width[1] ); +} + +// no change required - redirect to source +if (!$changes) +{ + header("X-i: No change"); + ierror( $page['src_url'], 301); +} + +$image->write( $page['derivative_path'] ); +$image->destroy(); + +$fp = fopen($page['derivative_path'], 'rb'); + +$fstat = fstat($fp); +header('Last-Modified: '.gmdate('D, d M Y H:i:s', $fstat['mtime']).' GMT'); +header('Expires: '.gmdate('D, d M Y H:i:s', time()+10*24*3600).' GMT'); +header('Content-length: '.$fstat['size']); +header('Connection: close'); + +$ctype="application/octet-stream"; +switch (strtolower($page['derivative_ext'])) +{ + case ".jpe": case ".jpeg": case ".jpg": $ctype="image/jpeg"; break; + case ".png": $ctype="image/png"; break; + case ".gif": $ctype="image/gif"; break; +} +header("Content-Type: $ctype"); + +fpassthru($fp); +exit; +?> \ No newline at end of file -- cgit v1.2.3