webPath = $webPath;
$this->cache = initializeCache();
}
public function isImageViewable($extension) {
global $config;
if (empty($extension) || trim($extension) === '') {
return false;
}
$extension = strtolower($extension);
if (!in_array($extension, $this->allowedImageExtensions)) {
return false;
}
$settingKey = getExtensionSetting($extension, 'viewing');
if ($settingKey !== null) {
return isset($config['viewable_files'][$settingKey]) ?
$config['viewable_files'][$settingKey] : false;
}
return false;
}
public function renderImageViewer($fullPath, $filename, $extension, $currentPath, $viewMode = 'default') {
global $router, $config;
$pathParts = explode('/', trim($currentPath, '/'));
$lastPart = end($pathParts);
if ($lastPart === $filename) {
array_pop($pathParts);
$currentPath = implode('/', $pathParts);
}
$relativePath = $currentPath ? $currentPath . '/' . $filename : $filename;
if ($this->cache->hasValidFile($fullPath, 'imageview_' . $viewMode)) {
echo $this->cache->getFile($fullPath, 'imageview_' . $viewMode);
exit;
}
ob_start();
$this->serveImageView($fullPath, $filename, $extension, $currentPath, $viewMode);
$output = ob_get_clean();
$this->cache->setFile($fullPath, $output, 'imageview_' . $viewMode);
echo $output;
exit;
}
private function serveImageView($fullPath, $filename, $extension, $currentPath, $viewMode = 'default') {
global $router, $config;
$disableRawImageViewing = isset($config['main']['disable_raw_image_conversion']) ?
$config['main']['disable_raw_image_conversion'] : true;
$maxResolution = isset($config['main']['max_image_resolution']) ?
$config['main']['max_image_resolution'] : '1920x1080';
list($maxWidth, $maxHeight) = explode('x', $maxResolution);
$maxWidth = (int)$maxWidth;
$maxHeight = (int)$maxHeight;
$fileSize = filesize($fullPath);
$fileSizeFormatted = $this->formatBytes($fileSize);
$fileModified = date('Y-m-d H:i:s', filemtime($fullPath));
$dimensions = $this->getImageDimensions($fullPath, $extension);
$originalDimensionText = $dimensions ? $dimensions['width'] . ' × ' . $dimensions['height'] . ' px' : 'Unknown';
$exceedsResolution = false;
if ($dimensions && ($dimensions['width'] > $maxWidth || $dimensions['height'] > $maxHeight)) {
$exceedsResolution = true;
}
$isTrueScale = ($viewMode === 'truescale');
$isSvgTrueScale = ($extension === 'svg' && $isTrueScale);
$needsSpecialHandling = in_array($extension, [
'tiff', 'psd', 'heic',
'cr2', 'cr3', 'nef', 'nrw', 'arw', 'raf', 'rw2', 'orf', 'pef', 'dng', '3fr', 'x3f',
'ai', 'fig', 'sketch', 'xcf'
]);
$downloadUrl = $router->generateFileURL($currentPath, $filename, 'download');
$viewUrl = $router->generateFileURL($currentPath, $filename, 'view', 'default');
$originalRawUrl = $router->generateFileURL($currentPath, $filename, 'view', 'raw');
$trueScaleUrl = $viewUrl . '&scale=true';
$imageDisplayUrl = $originalRawUrl;
$currentFullUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$backUrl = preg_replace('/\/[^\/]+\/\?.*$/', '/', $currentFullUrl);
if (!preg_match('/\?/', $currentFullUrl)) {
$backUrl = preg_replace('/\/[^\/]+\/$/', '/', $currentFullUrl);
}
$securityStatus = getSecurityStatus();
$lockIcon = $securityStatus['secure']
? $this->webPath . '/.indexer_files/icons/app/green.png'
: $this->webPath . '/.indexer_files/icons/app/red.png';
$convertedDimensions = null;
$dimensionText = $originalDimensionText;
if ($disableRawImageViewing && $needsSpecialHandling) {
$showError = true;
$errorMessage = "Raw image viewing is disabled on this server.
Please download the file to view it.";
} else {
$showError = false;
$errorMessage = '';
if (($exceedsResolution && !$isTrueScale) || $needsSpecialHandling) {
$conversionResult = $this->attemptImageConversion($fullPath, $extension, $maxWidth, $maxHeight);
if ($conversionResult) {
$imageDisplayUrl = $conversionResult['data'];
$convertedDimensions = $conversionResult['dimensions'];
if ($convertedDimensions) {
$dimensionText = $originalDimensionText . ' (converted: ' .
$convertedDimensions['width'] . ' × ' .
$convertedDimensions['height'] . ' px)';
}
} elseif ($needsSpecialHandling) {
$showError = true;
$errorMessage = "This image format (" . strtoupper($extension) . ") requires special server extensions to display.
Please download the file or view raw to see the image.";
}
}
}
?>