using System; using System.IO; using System.Net; using System.Net.Http; using Microsoft.AspNetCore.Mvc; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Media; using Umbraco.Core.Models; using Umbraco.Web.BackOffice.Controllers; using Umbraco.Web.Common.Attributes; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi; namespace Umbraco.Web.Editors { /// /// A controller used to return images for media /// [PluginController("UmbracoApi")] public class ImagesController : UmbracoAuthorizedApiController { private readonly IMediaFileSystem _mediaFileSystem; private readonly IContentSettings _contentSettings; private readonly IImageUrlGenerator _imageUrlGenerator; public ImagesController(IMediaFileSystem mediaFileSystem, IContentSettings contentSettings, IImageUrlGenerator imageUrlGenerator) { _mediaFileSystem = mediaFileSystem; _contentSettings = contentSettings; _imageUrlGenerator = imageUrlGenerator; } /// /// Gets the big thumbnail image for the original image path /// /// /// /// /// If there is no original image is found then this will return not found. /// public IActionResult GetBigThumbnail(string originalImagePath) { return string.IsNullOrWhiteSpace(originalImagePath) ? Ok() : GetResized(originalImagePath, 500); } /// /// Gets a resized image for the image at the given path /// /// /// /// /// /// If there is no media, image property or image file is found then this will return not found. /// public IActionResult GetResized(string imagePath, int width) { var ext = Path.GetExtension(imagePath); // we need to check if it is an image by extension if (_contentSettings.IsImageFile(ext) == false) return NotFound(); //redirect to ImageProcessor thumbnail with rnd generated from last modified time of original media file DateTimeOffset? imageLastModified = null; try { imageLastModified = _mediaFileSystem.GetLastModified(imagePath); } catch (Exception) { // if we get an exception here it's probably because the image path being requested is an image that doesn't exist // in the local media file system. This can happen if someone is storing an absolute path to an image online, which // is perfectly legal but in that case the media file system isn't going to resolve it. // so ignore and we won't set a last modified date. } var rnd = imageLastModified.HasValue ? $"&rnd={imageLastModified:yyyyMMddHHmmss}" : null; var imageUrl = _imageUrlGenerator.GetImageUrl(new ImageUrlGenerationOptions(imagePath) { UpScale = false, Width = width, AnimationProcessMode = "first", ImageCropMode = "max", CacheBusterValue = rnd }); return new RedirectResult(imageUrl, false); } /// /// Gets a processed image for the image at the given path /// /// /// /// /// /// /// /// /// /// /// /// If there is no media, image property or image file is found then this will return not found. /// public string GetProcessedImageUrl(string imagePath, int? width = null, int? height = null, int? focalPointLeft = null, int? focalPointTop = null, string animationProcessMode = "first", string mode = "max", bool upscale = false, string cacheBusterValue = "") { var options = new ImageUrlGenerationOptions(imagePath) { AnimationProcessMode = animationProcessMode, CacheBusterValue = cacheBusterValue, Height = height, ImageCropMode = mode, UpScale = upscale, Width = width, }; if (focalPointLeft.HasValue && focalPointTop.HasValue) { options.FocalPoint = new ImageUrlGenerationOptions.FocalPointPosition(focalPointTop.Value, focalPointLeft.Value); } return _imageUrlGenerator.GetImageUrl(options); } } }