116 lines
3.8 KiB
PHP
116 lines
3.8 KiB
PHP
<?php
|
|
/******************************************************************************
|
|
* YMS - Yacht Management Software
|
|
* Copyright (C) 2024-2026 Thomas Hooge
|
|
*
|
|
* SPDX-License-Identifier: WTFPL
|
|
******************************************************************************
|
|
|
|
*/
|
|
|
|
// ========== FILE FUNCTIONS ==================================================
|
|
|
|
function file_fix_filesize($docid, $filepath) {
|
|
// set filesize in database to current size in filesystem
|
|
global $pdo;
|
|
$newsize = filesize($filepath);
|
|
$sql = "UPDATE document SET docsize=? WHERE docid=?";
|
|
$params = [$newsize, $docid];
|
|
$sth = $pdo->prepare($sql);
|
|
try {
|
|
$sth->execute($params);
|
|
} catch (PDOexception $e) {
|
|
$g_error->Add('SQL-Error: '. $e->getMessage());
|
|
$g_error->Add($sql);
|
|
$g_error->Add(print_r($params, true));
|
|
}
|
|
return $newsize;
|
|
}
|
|
|
|
function file_get_docname($docid, $doctype, $extension) {
|
|
global $g_doc_typemap;
|
|
return sprintf('%s-%06d.%s', $g_doc_typemap[$doctype], $docid, $extension);
|
|
}
|
|
|
|
function dir_get_size($path) {
|
|
// gets the size of a directory in bytes recursively
|
|
$total = 0;
|
|
$iterator = new RecursiveIteratorIterator(
|
|
new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)
|
|
);
|
|
foreach ($iterator as $file){
|
|
$total += $file->getSize();
|
|
}
|
|
return $total;
|
|
}
|
|
|
|
function image_scale($imagefile, $mimetype, $width, $height, $factor) {
|
|
// scales down image in place
|
|
// returns size in bytes for new scaled image or -1 in case of error
|
|
global $g_message, $g_error;
|
|
|
|
if ($factor <= 0 || $factor >= 1) {
|
|
$g_error->Add("Internal error: Invalid image scale factor");
|
|
return -1;
|
|
}
|
|
$width = (int)($width * $factor);
|
|
$height = (int)($height * $factor);
|
|
if ($width < 1 || $height < 1) {
|
|
$g_error->Add("Internal error: Scaled image dimensions are too small");
|
|
return -1;
|
|
}
|
|
if ($mimetype == 'image/jpeg') {
|
|
$orig = imagecreatefromjpeg($imagefile);
|
|
if ($orig === false) {
|
|
$g_error->Add("Internal error: imagecreatefromjpeg failed");
|
|
return -1;
|
|
}
|
|
$scaled = imagescale($orig, $width, $height, IMG_BICUBIC); // TODO IMG_BICUBIC_FIXED?
|
|
if ($scaled === false) {
|
|
imagedestroy($orig);
|
|
$g_error->Add("Internal error: jpeg imagescale failed");
|
|
return -1;
|
|
}
|
|
if (!imagejpeg($scaled, $imagefile, 85)) {
|
|
imagedestroy($scaled);
|
|
imagedestroy($orig);
|
|
$g_error->Add("Internal error: imagejpeg failed");
|
|
return -1;
|
|
}
|
|
} else if ($mimetype == 'image/png') {
|
|
$orig = imagecreatefrompng($imagefile);
|
|
if ($orig === false) {
|
|
$g_error->Add("Internal error: imagecreatefrompng failed");
|
|
return -1;
|
|
}
|
|
$scaled = imagescale($orig, $width, $height, IMG_BICUBIC);
|
|
if ($scaled === false) {
|
|
imagedestroy($orig);
|
|
$g_error->Add("Internal error: png imagescale failed");
|
|
return -1;
|
|
}
|
|
// Preserve PNG transparency
|
|
imagealphablending($scaled, false);
|
|
imagesavealpha($scaled, true);
|
|
if (!imagepng($scaled, $imagefile, 9)) {
|
|
imagedestroy($scaled);
|
|
imagedestroy($orig);
|
|
$g_error->Add("Internal error: imagepng failed");
|
|
return -1;
|
|
}
|
|
} else {
|
|
$g_error->Add(sprintf(_('Internal error: Unknown mimetype %s!'), $mimetype));
|
|
return -1;
|
|
}
|
|
$g_message->add(sprintf(_('Image scaled down to %dx%d'), $width, $height));
|
|
imagedestroy($scaled);
|
|
imagedestroy($orig);
|
|
clearstatcache(true, $imagefile);
|
|
$size = filesize($imagefile);
|
|
if ($size === false) {
|
|
$g_error->Add("Internal error: filesize failed");
|
|
return -1;
|
|
}
|
|
return $size;
|
|
}
|