<?php 
/** 
 * imageHandler.php 
 * 
 * 
 * imageHandler web (REST GET/PUT, json) service interface 
 * 
 * @package imageHandler 
 * @copyright 2015, Kjell-Inge Gustafsson kigkonsult, All rights reserved 
 * @author    Kjell-Inge Gustafsson, kigkonsult <[email protected]> 
 * @link      http://kigkonsult.se/imageHandler/index.php 
 * @license   non-commercial use: Creative Commons 
 *            Attribution-NonCommercial-NoDerivatives 4.0 International License 
 *            (http://creativecommons.org/licenses/by-nc-nd/4.0/) 
 *            commercial use :imageHandler141license / imageHandler14Xlicense 
 * @version   1.4 
 * 
 * json main key             i  / image 
 * 
 * REST GET/POST keys  OR  json (object) properties 
 *                           i  / image     : filename or url, required 
 *                           o  / operation : 1/'download', 2/'stream' (default), 3/'save' (to disk) 
 *                           n  / name      : image output (display/save) name (opt) 
 *                           p              : bool, TRUE jpg/gif output as png (default) , FALSE not 
 *                                            TRUE also force png extension 
 *                                            settings for the resizeable image, all opt, percent or pixels 
 *                           cx             : crop start x coordinate, from left border (0%), to right border (100%), default 0 
 *                           cy             : crop start y coordinate, from top border (0%), to bottom border (100%), default 0 
 *                           cw / cwidth    : image crop, width 
 *                           ch / cheight   : image crop, height 
 *                           w  / width 
 *                           h  / height 
 *                           mw / maxwidth 
 *                           mh / maxheight 
 */ 
      /* ******************************************************************* 
         manage input 
         ******************************************************************* */ 
$keys       = array( 'image', 'i', 
                     'operate', 'o', 'name', 'n', 'p', 
                     'cx', 'cy', 'cwidth', 'cw', 'cheight', 'ch', 'width', 'w', 'height', 'h', 'maxwidth', 'mw', 'maxheight', 'mh' 
                   ); 
$input      = array(); 
foreach( $keys as $key ) { 
  if( array_key_exists( $key, $_REQUEST )) 
    $input[$key] = $_REQUEST[$key]; 
} 
$_REQUEST = $keys = array(); 
if( FALSE === (bool) ( $imageStr = checkInputValue( 'image', 'i' ))) 
  exit(); 
else 
  unset( $input['image'], $input['i'] ); 
        /* ******************************************************************* 
         imageHandler include and env./log setup and 
         ******************************************************************* */ 
include './imageHandler.class.php'; 
ini_set( 'memory_limit', '2048M' );              // if managing larger images ?? 
                                                 // path to imageHandler directory 
$basePath   = dirname( __FILE__ ) . DIRECTORY_SEPARATOR; 
                                                 // log filename or FALSE 
$logFile    = $basePath . 'log' . DIRECTORY_SEPARATOR . 'imageHandler.log'; 
$logprio    = LOG_DEBUG;                         // default LOG_NOTICE 
if( $logFile ) { 
  date_default_timezone_set( 'Europe/Stockholm' ); // required if using Log 
  include 'Log.php';                             // here are PEAR log used but extended 
  class imageHandlerLog extends Log { public function _destruct() { $this->flush(); parent::_destruct(); }} 
  $log      = imageHandlerLog::factory( 'file', $logFile, 'ih', array(), $logprio ); 
} 
      /* ******************************************************************* 
         json check 
         ******************************************************************* */ 
$result     = json_decode( $imageStr, TRUE ); 
$jres       = jsonTest( json_last_error()); 
if( empty( $input ) && is_array( $result )) {    // json!! 
  if( TRUE !== $jres ) {                         // but json error... 
    if( $log ) $log->log( basename( __FILE__ )." $jres, input=".var_export( $imageStr, TRUE ), LOG_ERR ); 
    exit(); 
  } 
  $input    = $result; 
  unset( $result ); 
  $imageStr = checkInputValue( 'image', 'i' ); 
  if( $log ) $log->log( basename( __FILE__ )." json input=".var_export( $input, TRUE ), LOG_DEBUG ); 
} 
elseif( $log ) $log->log( basename( __FILE__ ).", input=$imageStr, ".var_export( $input, TRUE ), LOG_DEBUG ); 
      /* ******************************************************************* 
         imageHandler optional config 
         ******************************************************************* */ 
if( $logFile ) { 
  imageHandler::$logger         = $log; 
  imageHandler::$logprio        = $logprio; 
} 
imageHandler::$defaultOperation = 1;             // default 2 
imageHandler::$outputpng        = ( array_key_exists( 'p', $input ) && empty( $input['p'] )) ? FALSE : TRUE; // true default 
// imageHandler::$imageLib         = ???         // image storage path, will prefix image (filename) (note, suffixed by '/'!!) 
// imageHandler::$filenamePrefix   = ???         // prefix for created (temp/output) filenames 
imageHandler::$cache            = '/opt/work/imageHandler/cache/';    // default 'sys_get_temp_dir()' 
      /* ******************************************************************* 
         operate !! 
         ******************************************************************* */ 
$operation  = checkInputValue( 'operate', 'o' ); 
if( ! is_numeric( $operation )) { 
  switch( $operation ) { 
    case 'download':  $operation = 1;    break; 
    case 'stream'  :  $operation = 2;    break; 
    case 'save'    :  $operation = 3;    break; 
    default        :  $operation = null; break; 
  } 
} 
imageHandler::Operate( $imageStr, 
                       array( 'operation' => $operation, 
                              'name'      => checkInputValue( 'name',      'n' ), 
                              'cx'        => checkInputValue(              'cx' ), 
                              'cy'        => checkInputValue(              'cy' ), 
                              'cwidth'    => checkInputValue( 'cwidth',    'cw' ), 
                              'cheight'   => checkInputValue( 'cheight',   'ch' ), 
                              'width'     => checkInputValue( 'width',     'w' ), 
                              'height'    => checkInputValue( 'height',    'h' ), 
                              'maxwidth'  => checkInputValue( 'maxwidth',  'mw' ), 
                              'maxheight' => checkInputValue( 'maxheight', 'mh' ), 
                            ) 
                     ); 
/** ************************************************************************* 
 * checkRequestValues 
 * 
 * check $input for keys, return first found and not empty (or null) 
 * 
 * @param string $key1 
 * @param string $key2 
 * @return mixed 
 */ 
function checkInputValue( $key1, $key2=null ) { 
  global $input; 
  if( ! empty( $key1 ) && ( array_key_exists( $key1, $input ) && (( 0 == $input[$key1] ) || ! empty( $input[$key1] )))) 
    return $input[$key1]; 
  if( ! empty( $key2 ) && ( array_key_exists( $key2, $input ) && (( 0 == $input[$key2] ) || ! empty( $input[$key2] )))) 
    return $input[$key2]; 
  return null; 
} 
/** 
 * return (decoded) json last error 
 * 
 * @param mixed $jres 
 * @return mixed bool TRUE on success, string on error 
 * @static 
 */ 
function jsonTest( $jres  ) { 
    switch( $jres ) { 
      case JSON_ERROR_NONE           :         return TRUE;  //  No error has occurred 
      case JSON_ERROR_DEPTH          :         return 'The maximum stack depth has been exceeded'; 
      case JSON_ERROR_STATE_MISMATCH :         return 'Invalid or malformed JSON'; 
      case JSON_ERROR_CTRL_CHAR      :         return 'Control character error, possibly incorrectly encoded'; 
      case JSON_ERROR_SYNTAX         :         return 'Syntax error'; 
      default: 
        if( version_compare( PHP_VERSION, '5.3.3', '>=' ) && (jres == JSON_ERROR_UTF8 )) 
                                               return 'Malformed UTF-8 characters, possibly incorrectly encoded'; 
        if( version_compare( PHP_VERSION, '5.5', '>=' )) { 
          switch( $jres ) { 
            case JSON_ERROR_RECURSION        : return 'One or more recursive references in the value to be encoded'; 
            case JSON_ERROR_INF_OR_NAN       : return 'One or more NAN or INF values in the value to be encoded'; 
            case JSON_ERROR_UNSUPPORTED_TYPE : return 'A value of a type that cannot be encoded was given'; 
          } 
        } 
        return 'Unknown json error code ('.str_replace( PHP_EOL, '', var_export( $jres, TRUE )).')'; 
  } 
} 
 
 |