示例#1
0
        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);
        }
示例#2
0
        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);
        }