public async Task <IActionResult> Image(string filename) { var invalidChars = Path.GetInvalidFileNameChars(); if (filename.IndexOfAny(invalidChars) >= 0) { return(BadRequest("invalid filename")); } _logger.LogTrace($"Requesting image file {filename}"); if (_blogConfig.ImageSettings.EnableCDNRedirect) { var imageUrl = _blogConfig.ImageSettings.CDNEndpoint.CombineUrl(filename); return(Redirect(imageUrl)); } var image = await _cache.GetOrCreateAsync(filename, async entry => { _logger.LogTrace($"Image file {filename} not on cache, fetching image..."); entry.SlidingExpiration = TimeSpan.FromMinutes(_settings.CacheSlidingExpirationMinutes["Image"]); var imageInfo = await _imageStorage.GetAsync(filename); return(imageInfo); }); if (null == image) { return(NotFound()); } return(File(image.ImageBytes, image.ImageContentType)); }
public async Task <IActionResult> GetImageAsync(string filename, [FromServices] IMemoryCache cache) { try { var invalidChars = Path.GetInvalidFileNameChars(); if (filename.IndexOfAny(invalidChars) >= 0) { Logger.LogWarning($"Invalid filename attempt '{filename}'."); return(BadRequest("invalid filename")); } Logger.LogTrace($"Requesting image file {filename}"); if (_cdnSettings.GetImageByCDNRedirect) { var imageUrl = Utils.CombineUrl(_cdnSettings.CDNEndpoint, filename); return(Redirect(imageUrl)); } var imageEntry = await cache.GetOrCreateAsync(filename, async entry => { Logger.LogTrace($"Image file {filename} not on cache, fetching image..."); entry.SlidingExpiration = TimeSpan.FromMinutes(AppSettings.CacheSlidingExpirationMinutes["Image"]); var imgBytesResponse = await _imageStorage.GetAsync(filename); return(imgBytesResponse); }); if (imageEntry.IsSuccess) { return(File(imageEntry.Item.ImageBytes, imageEntry.Item.ImageContentType)); } Logger.LogError($"Error getting image, filename: {filename}, {imageEntry.Message}"); return(_blogConfig.ContentSettings.UseFriendlyNotFoundImage ? (IActionResult)File("~/images/image-not-found.png", "image/png") : NotFound()); } catch (Exception e) { Logger.LogError(e, $"Error requesting image {filename}"); return(ServerError()); } }
public async Task <IActionResult> Image(string filename, [FromServices] IMemoryCache cache) { try { var invalidChars = Path.GetInvalidFileNameChars(); if (filename.IndexOfAny(invalidChars) >= 0) { return(BadRequest("invalid filename")); } _logger.LogTrace($"Requesting image file {filename}"); if (_imageStorageSettings.CDNSettings.EnableCDNRedirect) { var imageUrl = _imageStorageSettings.CDNSettings.CDNEndpoint.CombineUrl(filename); return(Redirect(imageUrl)); } var imageEntry = await cache.GetOrCreateAsync(filename, async entry => { _logger.LogTrace($"Image file {filename} not on cache, fetching image..."); entry.SlidingExpiration = TimeSpan.FromMinutes(_settings.CacheSlidingExpirationMinutes["Image"]); var imgBytesResponse = await _imageStorage.GetAsync(filename); return(imgBytesResponse); }); if (null == imageEntry) { return(NotFound()); } return(File(imageEntry.ImageBytes, imageEntry.ImageContentType)); } catch (Exception e) { _logger.LogError(e, $"Error requesting image {filename}"); return(StatusCode(StatusCodes.Status500InternalServerError)); } }