int('w');
$HEIGHT = $INPUT->int('h');
$CACHE = calc_cache($INPUT->str('cache'));
$opt = $INPUT->str('opt'); // phpThumb options
$mimetypes = getMimeTypes();
if(!$INPUT->str('src')){
//get input
$MEDIA = stripctl(getID('media', false)); // no cleaning except control chars - maybe external
$REV = & $INPUT->ref('rev');
//sanitize revision
$REV = preg_replace('/[^0-9]/', '', $REV);
list($EXT, $MIME, $DL) = mimetype($MEDIA, false);
if($EXT === false) {
$EXT = 'unknown';
$MIME = 'application/octet-stream';
$DL = true;
}
// check for permissions, preconditions and cache external files
list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT);
// prepare data for plugin events
$data = array(
'media' => $MEDIA,
'file' => $FILE,
'orig' => $FILE,
'mime' => $MIME,
'download' => $DL,
'cache' => $CACHE,
'ext' => $EXT,
'width' => $WIDTH,
'height' => $HEIGHT,
'status' => $STATUS,
'statusmessage' => $STATUSMESSAGE,
'ispublic' => media_ispublic($MEDIA),
);
// handle the file status
$evt = new Doku_Event('FETCH_MEDIA_STATUS', $data);
if($evt->advise_before()) {
// redirects
if($data['status'] > 300 && $data['status'] <= 304) {
if (defined('SIMPLE_TEST')) return; //TestResponse doesn't recognize redirects
send_redirect($data['statusmessage']);
}
// send any non 200 status
if($data['status'] != 200) {
http_status($data['status'], $data['statusmessage']);
}
// die on errors
if($data['status'] > 203) {
print $data['statusmessage'];
if (defined('SIMPLE_TEST')) return;
exit;
}
}
$evt->advise_after();
unset($evt);
//handle image resizing/cropping/phpThumbing
if((substr($MIME, 0, 5) == 'image') && ($WIDTH || $HEIGHT)) {
if ($opt){
$data['file'] = $FILE = media_photogallery_image($data['file'],$EXT,$WIDTH,$HEIGHT,$opt);
} else {
if($HEIGHT && $WIDTH) {
$data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT);
} else {
$data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT);
}
}
}
// finally send the file to the client
$evt = new Doku_Event('MEDIA_SENDFILE', $data);
if($evt->advise_before()) {
sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig']);
}
// Do something after the download finished.
$evt->advise_after(); // will not be emitted on 304 or x-sendfile
} else{
$FILE = PHOTOGALLERY_IMAGES_FILE.$INPUT->str('src');
list($EXT, $MIME, $DL) = mimetype($FILE, false);
list($STATUS, $STATUSMESSAGE) = checkLocalFileStatus($FILE, $WIDTH, $HEIGHT);
// // send any non 200 status
if($STATUS != 200) {
http_status($STATUS, $STATUSMESSAGE);
}
if ($opt)
$FILE = media_photogallery_image($FILE,$EXT,$WIDTH,$HEIGHT,$opt);
else
$FILE = media_crop_image($FILE, $EXT, $WIDTH, $HEIGHT);
sendFile($FILE, $MIME, $DL, $CACHE, false, $FILE);
}
// END DO main
/**
* Check local image file for preconditions and return correct status code
*
* READ: MIME, EXT, CACHE
* WRITE: FILE, array( STATUS, STATUSMESSAGE )
*
* @author Marco Nolletti
*
* @param string $file reference to the file variable
* @param int $width
* @param int $height
* @return array as array(STATUS, STATUSMESSAGE)
*/
function checkLocalFileStatus($file, $width=0, $height=0) {
global $MIME, $EXT, $CACHE, $INPUT;
//media to local file
if(empty($file)) {
return array(400, 'Bad request');
}
// check token for resized images
if (($width || $height) && media_get_token($file, $width, $height) !== $INPUT->str('tok')) {
return array(412, 'Precondition Failed');
}
//check file existance
if(!file_exists($file)) {
return array(404, 'Not Found');
}
return array(200, null);
}
function media_photogallery_image($file, $ext, $w, $h, $opt){
//die();
// create phpThumb object
$phpThumb = new phpThumb();
// this is very important when using a single object to process multiple images
$phpThumb->resetObject();
// set data source -- do this first, any settings must be made AFTER this call
$phpThumb->setSourceFilename($file);
// $phpThumb->setParameter('config_document_root', '/home/groups/p/ph/phpthumb/htdocs/');
// $phpThumb->setParameter('config_allow_src_above_docroot', true); // needed if you're working outside DOCUMENT_ROOT, in a temp dir for example
$phpThumb->setParameter('config_output_format', 'jpg');
$phpThumb->setParameter('config_imagemagick_path', '/usr/local/bin/convert');
$phpThumb->setParameter('config_temp_directory', DOKU_INC.'data/cache/');
$phpThumb->setParameter('config_prefer_imagemagick', true);
$phpThumb->setParameter('config_disable_debug',true);
$phpThumb->setParameter('config_cache_directory',null);
$phpThumb->setParameter('w', $w);
$phpThumb->setParameter('h', $h);
foreach (explode('!',$opt) as $par) {
preg_match('/^(.+)=(.+)$/', $par, $options);
$phpThumb->setParameter($options[1], $options[2]);
}
// generate & output thumbnail
$output_filename = getCacheName($file,'.media.'.$w.'x'.$h.'.photogallery.'.$phpThumb->config_output_format);
if ($phpThumb->GenerateThumbnail()) { // this line is VERY important, do not remove it!
if ($output_filename) {
if ($phpThumb->RenderToFile($output_filename)) {
// do something on success
return $output_filename;
//echo 'Successfully rendered:
';
} else {
// do something with debug/error messages
echo 'Failed (size='.$thumbnail_width.'):
'.implode("\n\n", $phpThumb->debugmessages).''; } $phpThumb->purgeTempFiles(); } else { $phpThumb->OutputThumbnail(); } } else { // do something with error messages echo 'Failed (size='.$thumbnail_width.').