From e99b27026f7dbf125e1d0f4cd28a65ca7e425275 Mon Sep 17 00:00:00 2001 From: jamesmoore Date: Fri, 21 Aug 2026 17:25:40 +0100 Subject: [PATCH 1/2] add versioned image urls --- SDMetaUI/Controllers/ImagesController.cs | 9 ++++ SDMetaUI/Models/ImageFileViewModel.cs | 46 ++++++++++---------- SDMetaUI/Models/ImageFileViewModelBuilder.cs | 15 ++++--- 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/SDMetaUI/Controllers/ImagesController.cs b/SDMetaUI/Controllers/ImagesController.cs index f877290..fcb3b85 100644 --- a/SDMetaUI/Controllers/ImagesController.cs +++ b/SDMetaUI/Controllers/ImagesController.cs @@ -14,6 +14,8 @@ public static IResult GetThumb( { try { + EnableCaching(httpResponse); + string physicalPath = Base32Decode(path); if (fileSystem.File.Exists(physicalPath)) { @@ -43,6 +45,8 @@ public static IResult GetFull( { try { + EnableCaching(httpResponse); + string physicalPath = Base32Decode(path); if (fileSystem.File.Exists(physicalPath)) { @@ -66,5 +70,10 @@ private static string Base32Decode(string base32EncodedData) var base32EncodedBytes = Base32Encoding.ToBytes(base32EncodedData); return System.Text.Encoding.UTF8.GetString(base32EncodedBytes); } + + private static void EnableCaching(HttpResponse httpResponse) + { + httpResponse.Headers.CacheControl = "public, max-age=31536000, immutable"; + } } } diff --git a/SDMetaUI/Models/ImageFileViewModel.cs b/SDMetaUI/Models/ImageFileViewModel.cs index 999418e..0b063bf 100644 --- a/SDMetaUI/Models/ImageFileViewModel.cs +++ b/SDMetaUI/Models/ImageFileViewModel.cs @@ -1,28 +1,30 @@ namespace SDMetaUI.Models { - public class ImageFileViewModel - { - private readonly Func func; + public class ImageFileViewModel + { + private readonly Func func; + private readonly string version; - public ImageFileViewModel(string fileName, string fullPromptHash, Func func) - { - FileName = fileName; - FullPromptHash = fullPromptHash; - this.func = func; - this.EncodedFileName = new(() => Base32Encode(this.FileName)); - } - public string FileName { get; } - public string ThumbnailUrl => $"/images/thumb/{EncodedFileName.Value}"; - public string ImageUrl => $"/images/full/{EncodedFileName.Value}/{func(this.FileName)}"; - public string FullPromptHash { get; } - public IList? SubItems { get; set; } + public ImageFileViewModel(string fileName, string fullPromptHash, string version, Func func) + { + FileName = fileName; + FullPromptHash = fullPromptHash; + this.version = version; + this.func = func; + this.EncodedFileName = new(() => Base32Encode(this.FileName)); + } + public string FileName { get; } + public string ThumbnailUrl => $"/images/thumb/{EncodedFileName.Value}?v={version}"; + public string ImageUrl => $"/images/full/{EncodedFileName.Value}/{func(this.FileName)}?v={version}"; + public string FullPromptHash { get; } + public IList? SubItems { get; set; } - private readonly Lazy EncodedFileName; + private readonly Lazy EncodedFileName; - private static string Base32Encode(string plainText) - { - var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); - return Base32Encoding.ToString(plainTextBytes); - } - } + private static string Base32Encode(string plainText) + { + var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText); + return Base32Encoding.ToString(plainTextBytes); + } + } } diff --git a/SDMetaUI/Models/ImageFileViewModelBuilder.cs b/SDMetaUI/Models/ImageFileViewModelBuilder.cs index 793f209..d0ad134 100644 --- a/SDMetaUI/Models/ImageFileViewModelBuilder.cs +++ b/SDMetaUI/Models/ImageFileViewModelBuilder.cs @@ -3,11 +3,12 @@ namespace SDMetaUI.Models { - public class ImageFileViewModelBuilder(IFileSystem fileSystem) - { - public ImageFileViewModel BuildModel(ImageFileSummary p) - { - return new ImageFileViewModel(p.FileName, p.FullPromptHash ?? "", fileSystem.Path.GetFileName); - } - } + public class ImageFileViewModelBuilder(IFileSystem fileSystem) + { + public ImageFileViewModel BuildModel(ImageFileSummary p) + { + var lastWriteTicks = fileSystem.FileInfo.New(p.FileName).LastWriteTimeUtc.Ticks.ToString(); + return new ImageFileViewModel(p.FileName, p.FullPromptHash ?? "", lastWriteTicks, fileSystem.Path.GetFileName); + } + } } From 646b09dcd212574fb57a58a5c42d690d4050d3d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:31:56 +0000 Subject: [PATCH 2/2] Move EnableCaching after file existence check to avoid caching 404/error responses Co-authored-by: jamesmoore <6506748+jamesmoore@users.noreply.github.com> --- SDMetaUI/Controllers/ImagesController.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/SDMetaUI/Controllers/ImagesController.cs b/SDMetaUI/Controllers/ImagesController.cs index fcb3b85..5e9a6c9 100644 --- a/SDMetaUI/Controllers/ImagesController.cs +++ b/SDMetaUI/Controllers/ImagesController.cs @@ -14,11 +14,10 @@ public static IResult GetThumb( { try { - EnableCaching(httpResponse); - string physicalPath = Base32Decode(path); if (fileSystem.File.Exists(physicalPath)) { + EnableCaching(httpResponse); var fileInfo = fileSystem.FileInfo.New(physicalPath); var thumbPath = thumbnailService.GetOrGenerateThumbnail(fileInfo.FullName); httpResponse.Headers.LastModified = fileInfo.LastWriteTimeUtc.ToString("R"); @@ -45,11 +44,10 @@ public static IResult GetFull( { try { - EnableCaching(httpResponse); - string physicalPath = Base32Decode(path); if (fileSystem.File.Exists(physicalPath)) { + EnableCaching(httpResponse); httpResponse.Headers.LastModified = fileSystem.FileInfo.New(physicalPath).LastWriteTimeUtc.ToString("R"); return Results.File(physicalPath, "image/png"); }