using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Extensions.FileProviders; using SixLabors.ImageSharp.Web; using SixLabors.ImageSharp.Web.Providers; using SixLabors.ImageSharp.Web.Resolvers; namespace zero.Media.ImageSharp; /// /// Returns images stored in the local physical file system. /// public class PhysicalFileProvider : IImageProvider { const string Prefix = "/:"; /// /// The file provider abstraction. /// readonly IFileProvider _fileProvider; /// /// Contains various format helper methods based on the current configuration. /// readonly FormatUtilities _formatUtilities; /// /// Initializes a new instance of the class. /// /// The environment used by this middleware. /// Contains various format helper methods based on the current configuration. public PhysicalFileProvider(IWebHostEnvironment environment, FormatUtilities formatUtilities) { this._fileProvider = environment.WebRootFileProvider; this._formatUtilities = formatUtilities; } /// public ProcessingBehavior ProcessingBehavior { get; } = ProcessingBehavior.CommandOnly; /// public Func Match { get; set; } = _ => true; /// public bool IsValidRequest(HttpContext context) { string displayUrl = context.Request.GetDisplayUrl(); if (!_formatUtilities.TryGetExtensionFromUri(displayUrl, out string extension)) { return false; } return displayUrl.Contains(Prefix); } /// public Task GetAsync(HttpContext context) { string path = GetPath(context); // Path has already been correctly parsed before here. IFileInfo fileInfo = this._fileProvider.GetFileInfo(path); // Check to see if the file exists. if (!fileInfo.Exists) { return Task.FromResult(null); } return Task.FromResult(new FileProviderImageResolver(fileInfo)); } string GetPath(HttpContext context) { string path = context.Request.Path.Value; List parts = path.Split('/').ToList(); parts.RemoveAt(parts.Count - 2); return String.Join('/', parts); } }