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);
}
}