From 155b8598ff5bbd1a31cd935286b326e11044d921 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Sun, 23 Nov 2025 15:36:11 -0500 Subject: [PATCH] Introduce cleanupUnusedImages function to delete referenced files that have been deleted when editing content which as been added to document template edit. Did not do this for documents as they are versioned and images will remain until the document is fully deleted --- admin/post/document_template.php | 24 +++++++++++++-------- functions.php | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/admin/post/document_template.php b/admin/post/document_template.php index bfe7f00d..f0754308 100644 --- a/admin/post/document_template.php +++ b/admin/post/document_template.php @@ -40,18 +40,24 @@ if (isset($_POST['edit_document_template'])) { $name = sanitizeInput($_POST['name']); $description = sanitizeInput($_POST['description']); - $processed_content = mysqli_escape_string( - $mysqli, - saveBase64Images( - $_POST['content'], - $_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/", - "uploads/document_templates/", - $document_template_id - ) + $processed_content = saveBase64Images( + $_POST['content'], + $_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/", + "uploads/document_templates/", + $document_template_id + ); + + $processed_content_escaped = mysqli_escape_string($mysqli, $processed_content); + + // CLEAN UP unused images + cleanupUnusedImages( + $processed_content, + $_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/" . $document_template_id, + "/uploads/document_templates/" . $document_template_id ); // Document edit query - mysqli_query($mysqli,"UPDATE document_templates SET document_template_name = '$name', document_template_description = '$description', document_template_content = '$processed_content', document_template_updated_by = $session_user_id WHERE document_template_id = $document_template_id"); + mysqli_query($mysqli,"UPDATE document_templates SET document_template_name = '$name', document_template_description = '$description', document_template_content = '$processed_content_escaped', document_template_updated_by = $session_user_id WHERE document_template_id = $document_template_id"); logAction("Document Template", "Edit", "$session_name edited document template $name", 0, $document_template_id); diff --git a/functions.php b/functions.php index 380b7388..dd8b91c4 100644 --- a/functions.php +++ b/functions.php @@ -1752,3 +1752,39 @@ function saveBase64Images(string $html, string $baseFsPath, string $baseWebPath, return $html; } + +function cleanupUnusedImages(string $html, string $folderFsPath, string $folderWebPath) { + + $folderFsPath = rtrim($folderFsPath, '/\\') . '/'; + $folderWebPath = rtrim($folderWebPath, '/\\') . '/'; + + if (!is_dir($folderFsPath)) { + return; // no folder = nothing to delete + } + + // 1. Get all files currently on disk + $filesOnDisk = glob($folderFsPath . "*"); + + // 2. Find all + preg_match_all('/]+src=["\']([^"\']+)["\']/i', $html, $matches); + $htmlImagePaths = $matches[1] ?? []; + + // Normalize paths: keep only filenames belonging to this template folder + $referencedFiles = []; + + foreach ($htmlImagePaths as $src) { + if (strpos($src, $folderWebPath) !== false) { + $filename = basename($src); + $referencedFiles[] = $filename; + } + } + + // 3. Delete any physical file not referenced in the HTML + foreach ($filesOnDisk as $filePath) { + $filename = basename($filePath); + + if (!in_array($filename, $referencedFiles)) { + unlink($filePath); + } + } +}