This repository has been archived on 2025-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
Files
qemudb/appimage.php
Chris Morgan 5f4998194a Screenshot class optimization. Defer creation of thumbnail and screenshot images until values are necessary.
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.
2006-07-10 15:18:08 +00:00

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);
?>