This greatly speeds up the loading of the main page as we create screenshot objects to check their other internal parameters and not output their images.
105 lines
3.2 KiB
PHP
105 lines
3.2 KiB
PHP
<?php
|
|
/**
|
|
* Shows a thumbnail or a full size screenshot.
|
|
*
|
|
* Mandatory parameters:
|
|
* - iId, image identifier
|
|
*
|
|
* Optional parameters:
|
|
* - bThumbnail, "true" if we want to see a thumbnail, "false" otherwise
|
|
* - sREQUEST_METHOD
|
|
*
|
|
* TODO:
|
|
* - rename and document sREQUEST_METHOD
|
|
* - replace iId with iScreenshotId
|
|
*/
|
|
|
|
// application environment
|
|
require("path.php");
|
|
require(BASE."include/incl.php");
|
|
require(BASE."include/filter.php");
|
|
require_once(BASE."include/screenshot.php");
|
|
|
|
// an image doesn't have a link, so a cookie makes no sense
|
|
header("Set-Cookie: ");
|
|
header("Pragma: ");
|
|
|
|
// is the user supposed to be viewing this image ?
|
|
if(!$_SESSION['current']->canViewImage($aClean['iId']))
|
|
util_show_error_page_and_exit("Insufficient privileges.");
|
|
|
|
if ($aClean['sREQUEST_METHOD']='HEAD')
|
|
{
|
|
/* WARNING! optimization of logic in include/screenshots.php */
|
|
if (sscanf($aClean['iId'],"%d", &$iId) < 1)
|
|
util_show_error_page_and_exit("Bad parameter");
|
|
|
|
$hResult = query_parameters("SELECT id, url FROM appData
|
|
WHERE id = '?'
|
|
AND type = 'image' LIMIT 1", $iId);
|
|
$fImage = 0;
|
|
if($hResult)
|
|
{
|
|
$oRow = mysql_fetch_object($hResult);
|
|
|
|
/* we need to use the url field from appData, this is the name of the file */
|
|
/* in the filesystem */
|
|
$fImage = fopen(appdb_fullpath("data/screenshots/".$oRow->url), "rb");
|
|
}
|
|
|
|
/* if the query failed or if we didn't find the image, we should */
|
|
/* report a 404 to the browser */
|
|
if(!$hResult || !$fImage)
|
|
{
|
|
header("404 No such image");
|
|
exit;
|
|
}
|
|
$fstat_val = fstat($fImage);
|
|
$iModTime = $fstat_val['mtime'];
|
|
$sMagic = fread($fImage,8);
|
|
fclose($fImage); /* don't leave the fopened image open */
|
|
/* identify what kind of image this is, if we can't identify it */
|
|
/* we should report that its a bad image */
|
|
if (strcmp("\x89PNG\r\n\x1A\n",$sMagic)==0)
|
|
{
|
|
header("Content-Type: image/png");
|
|
} else if (preg_match("^\xD8\xFF^",$sMagic)) {
|
|
header("Content-Type: image/jpeg");
|
|
} else {
|
|
header("500 Bad image format");
|
|
exit;
|
|
}
|
|
header("Cache-Control: public");
|
|
header("Expires: ");
|
|
header("Last-Modified: ".fHttpDate($iModTime));
|
|
}
|
|
|
|
$oScreenshot = new Screenshot($aClean['iId']);
|
|
|
|
/* at this point, we know that .../screenshots/$oScreenshot->sUrl and
|
|
* .../screenshots/thumbnails/$oScreenshot->sUrl both exist as normally
|
|
* they would both be created at the same time. */
|
|
$fstat_val = stat(appdb_fullpath("data/screenshots/".$oScreenshot->sUrl));
|
|
$iModTime = $fstat_val['mtime'];
|
|
|
|
header("Cache-Control: public");
|
|
header("Expires: ");
|
|
|
|
/* if the browser is asking if the file was modified since a particular date */
|
|
/* and the date is the same that the file was modified, then we can report */
|
|
/* that the file wasn't modified, the browser can used the cached image */
|
|
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
|
|
$iModTime == pHttpDate($_SERVER['HTTP_IF_MODIFIED_SINCE']))
|
|
{
|
|
header("HTTP/1.0 304 Not Modified");
|
|
exit;
|
|
}
|
|
|
|
header("Last-Modified: ".fHttpDate($iModTime));
|
|
|
|
if(!$aClean['bThumbnail'])
|
|
$oScreenshot->output_screenshot(false);
|
|
else
|
|
$oScreenshot->output_screenshot(true);
|
|
?>
|