public virtual async Task <FileAndDir> SaveImageAsync(IFormFile file, ResizeOptions resizeOptions) { var ext = GetAllowedExtension(file.FileName); if (ext == null) { throw new SunException($"Not allowed extension"); } if (ext == ".svg" && file.Length >= MaxSvgSizeBytes) { throw new SunException($"Svg max size is {MaxSvgSizeBytes / 1024} kb"); } else { await using var stream = file.OpenReadStream(); if (!IsAllowedImageFormat(Image.DetectFormat(stream).Name)) { throw new SunException("Not allowed image format"); } var imageInfo = Image.Identify(stream); if (imageInfo.Width > imagesOptions.CurrentValue.MaxImageWidth || imageInfo.Height > imagesOptions.CurrentValue.MaxImageHeight) { throw new SunException( $"Very big image. Max image height, width is {imagesOptions.CurrentValue.MaxImageHeight}, {imagesOptions.CurrentValue.MaxImageWidth}"); } } var fileAndDir = imagesNamesService.GetNewImageNameAndDir(ext); var dirFullPath = Path.Combine(UploadImagesDir, fileAndDir.Dir); var fullFileName = Path.Combine(dirFullPath, fileAndDir.File); lock (lockObject) if (!Directory.Exists(dirFullPath)) { Directory.CreateDirectory(dirFullPath); } if (ext == ".svg") { await using var stream = new FileStream(fullFileName, FileMode.Create); await file.CopyToAsync(stream); } else { await using var stream = file.OpenReadStream(); using var image = Image.Load(stream); var(width, height) = image.Size(); if (width > resizeOptions.Size.Width || height > resizeOptions.Size.Height) { image.Mutate(x => x.Resize(resizeOptions)); } image.Save(fullFileName); } return(fileAndDir); }
public virtual async Task <FileAndDir> SaveImageAsync(IFormFile file, ResizeOptions resizeOptions) { var ext = GetAllowedExtension(file.FileName); if (ext == null) { throw new Exception($"Not allowed extension"); } if (ext == ".svg" && file.Length >= MaxSvgSizeBytes) { throw new Exception($"Svg max size is {MaxSvgSizeBytes / 1024} kb"); } var fileAndDir = imagesNamesService.GetNewImageNameAndDir(ext); var dirFullPath = Path.Combine(env.WebRootPath, imagesOptions.UploadDir, fileAndDir.Dir); var fullFileName = Path.Combine(dirFullPath, fileAndDir.File); lock (lockObject) if (!Directory.Exists(dirFullPath)) { Directory.CreateDirectory(dirFullPath); } if (ext == ".svg") { using (var stream = new FileStream(fullFileName, FileMode.Create)) await file.CopyToAsync(stream); } else { using (var stream = file.OpenReadStream()) using (Image <Rgba32> image = Image.Load(stream)) { var size = image.Size(); if (size.Width > resizeOptions.Size.Width || size.Height > resizeOptions.Size.Height) { image.Mutate(x => x.Resize(resizeOptions)); } image.Save(fullFileName); } } return(fileAndDir); }