diff --git a/framework/src/Volo.Abp.Core/System/IO/AbpStreamExtensions.cs b/framework/src/Volo.Abp.Core/System/IO/AbpStreamExtensions.cs index 110b828dbe..e2c3e6524d 100644 --- a/framework/src/Volo.Abp.Core/System/IO/AbpStreamExtensions.cs +++ b/framework/src/Volo.Abp.Core/System/IO/AbpStreamExtensions.cs @@ -37,6 +37,7 @@ public static class AbpStreamExtensions { stream.Position = 0; } + return stream.CopyToAsync( destination, 81920, //this is already the default value, but needed to set to be able to pass the cancellationToken @@ -50,12 +51,15 @@ public static class AbpStreamExtensions { stream.Position = 0; } + var memoryStream = new MemoryStream(); await stream.CopyToAsync(memoryStream, cancellationToken); + if (stream.CanSeek) { stream.Position = 0; } + memoryStream.Position = 0; return memoryStream; } @@ -66,12 +70,15 @@ public static class AbpStreamExtensions { stream.Position = 0; } + var memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); + if (stream.CanSeek) { stream.Position = 0; } + memoryStream.Position = 0; return memoryStream; } diff --git a/framework/src/Volo.Abp.Http/Volo/Abp/Http/MimeTypes.cs b/framework/src/Volo.Abp.Http/Volo/Abp/Http/MimeTypes.cs index ca7ab6777b..d39fad36c7 100644 --- a/framework/src/Volo.Abp.Http/Volo/Abp/Http/MimeTypes.cs +++ b/framework/src/Volo.Abp.Http/Volo/Abp/Http/MimeTypes.cs @@ -4,7 +4,7 @@ namespace Volo.Abp.Http; /* Taken from https://gist.github.com/markwhitaker/b29c0142360714688a7cf863ab33e5c9 */ -public static class MimeTypes +public static class MimeTypes //TODO: Move to Volo.Abp.Core with the same namespace { public static class Application { diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressor.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressor.cs index 610b320c46..f2338887a0 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressor.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressor.cs @@ -4,9 +4,10 @@ using System.Threading.Tasks; namespace Volo.Abp.Image; -public interface IImageCompressor +public interface IImageCompressor // TODO: RENAME: IImageCompressorContributor { - Task CompressAsync(Stream stream, CancellationToken cancellationToken = default); + //TODO: new extension method that works with byte arrays + Task CompressAsync(Stream stream, CancellationToken cancellationToken = default); // TODO: TryCompressAsync & remove CanCompress Stream Compress(Stream stream); diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorManager.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorManager.cs new file mode 100644 index 0000000000..f986b2c531 --- /dev/null +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorManager.cs @@ -0,0 +1,14 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using JetBrains.Annotations; + +namespace Volo.Abp.Image; + +public interface IImageCompressorManager // TODO: Rename to IImageCompressor +{ + Task CompressAsync( + Stream stream, + [CanBeNull] IImageFormat imageFormat = null, + CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorSelector.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorSelector.cs index 5a447f22dd..a847ecc713 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorSelector.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageCompressorSelector.cs @@ -1,6 +1,6 @@ namespace Volo.Abp.Image; -public interface IImageCompressorSelector +public interface IImageCompressorSelector //TODO: Remove, merge to IImageCompressorManager { IImageCompressor FindCompressor(IImageFormat imageFormat); } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageFormat.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageFormat.cs index 76d57ab922..e892d980cb 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageFormat.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageFormat.cs @@ -2,6 +2,5 @@ public interface IImageFormat { - string Name { get; } string MimeType { get; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizeParameter.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizeParameter.cs index 874c9f95b2..a53d4f04c9 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizeParameter.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizeParameter.cs @@ -1,6 +1,6 @@ namespace Volo.Abp.Image; -public interface IImageResizeParameter +public interface IImageResizeParameter //TODO: Remove { int? Width { get; } int? Height { get; } diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizer.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizer.cs index a0ed3e161b..a1a7e788f5 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizer.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/IImageResizer.cs @@ -7,9 +7,9 @@ namespace Volo.Abp.Image; public interface IImageResizer { Task ResizeAsync(Stream stream, IImageResizeParameter resizeParameter, - CancellationToken cancellationToken = default); + CancellationToken cancellationToken = default); //TODO: TryResizeAsync... - Stream Resize(Stream stream, IImageResizeParameter resizeParameter); + Stream Resize(Stream stream, IImageResizeParameter resizeParameter); //TODO: Remove - bool CanResize(IImageFormat imageFormat); + bool CanResize(IImageFormat imageFormat); //TODO: Discard (merge with TryResizeAsync) } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/ImageFormat.cs b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/ImageFormat.cs index ddf7aa6d4d..330f7ecf4d 100644 --- a/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/ImageFormat.cs +++ b/framework/src/Volo.Abp.Image.Abstractions/Volo/Abp/Image/ImageFormat.cs @@ -2,12 +2,10 @@ public class ImageFormat : IImageFormat { - public ImageFormat(string name, string mimeType) + public ImageFormat(string mimeType) { - Name = name; MimeType = mimeType; } - public string Name { get; } public string MimeType { get; } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageCompressor.cs b/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageCompressor.cs index dbb2f27e25..72d395b34b 100644 --- a/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageCompressor.cs +++ b/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageCompressor.cs @@ -14,20 +14,22 @@ public class ImageSharpImageCompressor : IImageCompressor, ITransientDependency { public async Task CompressAsync(Stream stream, CancellationToken cancellationToken = default) { - var newStream = await stream.CreateMemoryStreamAsync(cancellationToken: cancellationToken); - using var image = await SixLabors.ImageSharp.Image.LoadAsync(newStream, cancellationToken); - newStream.Position = 0; - var format = await SixLabors.ImageSharp.Image.DetectFormatAsync(newStream, cancellationToken); - newStream.Position = 0; + var memoryStream = await stream.CreateMemoryStreamAsync(cancellationToken: cancellationToken); + + using var image = await SixLabors.ImageSharp.Image.LoadAsync(memoryStream, cancellationToken); + memoryStream.Position = 0; + + var format = await SixLabors.ImageSharp.Image.DetectFormatAsync(memoryStream, cancellationToken); + memoryStream.Position = 0; + var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format); - switch (encoder) { case JpegEncoder jpegEncoder: jpegEncoder.Quality = 60; break; case PngEncoder pngEncoder: - pngEncoder.CompressionLevel = PngCompressionLevel.BestCompression; + pngEncoder.CompressionLevel = PngCompressionLevel.BestCompression; //TODO: AbpImageSharpOptions (others too) pngEncoder.IgnoreMetadata = true; break; case WebpEncoder webPEncoder: @@ -35,12 +37,13 @@ public class ImageSharpImageCompressor : IImageCompressor, ITransientDependency webPEncoder.UseAlphaCompression = true; break; case null: - throw new NotSupportedException($"No encoder available for provided path: {format.Name}"); + throw new NotSupportedException($"No encoder available for the given format: {format.Name}"); } - await image.SaveAsync(newStream, encoder, cancellationToken: cancellationToken); - newStream.SetLength(newStream.Position); - return newStream; + await image.SaveAsync(memoryStream, encoder, cancellationToken: cancellationToken); + memoryStream.SetLength(memoryStream.Position); + + return memoryStream; } public Stream Compress(Stream stream) @@ -77,6 +80,7 @@ public class ImageSharpImageCompressor : IImageCompressor, ITransientDependency public bool CanCompress(IImageFormat format) { + //TODO: Use MimeTypes (after moving it to Volo.Abp.Core) return format?.MimeType switch { "image/jpeg" => true, "image/png" => true, diff --git a/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageFormatDetector.cs b/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageFormatDetector.cs index f668fbe000..eab8874b21 100644 --- a/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageFormatDetector.cs +++ b/framework/src/Volo.Abp.Image.ImageSharp/Volo/Abp/Image/ImageSharpImageFormatDetector.cs @@ -8,6 +8,6 @@ public class ImageSharpImageFormatDetector : IImageFormatDetector, ITransientDep public IImageFormat FindFormat(Stream stream) { var format = SixLabors.ImageSharp.Image.DetectFormat(stream); - return new ImageFormat(format.Name, format.DefaultMimeType); + return new ImageFormat(format.DefaultMimeType); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageCompressor.cs b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageCompressor.cs index fa96b026fb..8c0745e5aa 100644 --- a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageCompressor.cs +++ b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageCompressor.cs @@ -13,7 +13,7 @@ public class MagickImageCompressor : IImageCompressor, ITransientDependency public async Task CompressAsync(Stream stream, CancellationToken cancellationToken = default) { var newStream = await stream.CreateMemoryStreamAsync(cancellationToken:cancellationToken); - try + try //TODO: Remove try/catch { _optimizer.IsSupported(newStream); newStream.Position = 0; diff --git a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageFormatDetector.cs b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageFormatDetector.cs index cb84e30023..0b9e437a2f 100644 --- a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageFormatDetector.cs +++ b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageFormatDetector.cs @@ -10,6 +10,6 @@ public class MagickImageFormatDetector : IImageFormatDetector, ITransientDepende { using var magickImage = new MagickImage(image); var format = magickImage.FormatInfo; - return format == null ? null : new ImageFormat(format.Format.ToString(), format.MimeType ?? string.Empty); + return format == null ? null : new ImageFormat(format.MimeType ?? string.Empty); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageResizer.cs b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageResizer.cs index 5fab17e825..6b2a599bb5 100644 --- a/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageResizer.cs +++ b/framework/src/Volo.Abp.Image.MagickNet/Volo/Abp/Image/MagickImageResizer.cs @@ -13,7 +13,7 @@ public class MagickImageResizer : IImageResizer, ITransientDependency CancellationToken cancellationToken = default) { var newStream = await stream.CreateMemoryStreamAsync(cancellationToken: cancellationToken); - try + try //TODO: Remove try/catch { using var image = new MagickImage(newStream); ApplyMode(image, resizeParameter); diff --git a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageCompressAttribute.cs b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageCompressAttribute.cs index 7935672bfe..2ab56ade35 100644 --- a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageCompressAttribute.cs +++ b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageCompressAttribute.cs @@ -11,6 +11,8 @@ using Volo.Abp.Content; namespace Volo.Abp.Image; +//Rename: CompressImageAttribute +//Also introduce ResizeImageAttribute(...) public class AbpImageCompressActionFilterAttribute : ActionFilterAttribute { public string[] Parameters { get; } diff --git a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageWebModule.cs b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageWebModule.cs index 9121f4660b..adb25dec5f 100644 --- a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageWebModule.cs +++ b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpImageWebModule.cs @@ -5,4 +5,5 @@ namespace Volo.Abp.Image; [DependsOn(typeof(AbpImageModule))] public class AbpImageWebModule : AbpModule { + } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpOriginalImageAttribute.cs b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpOriginalImageAttribute.cs index e2ee6078dd..3e747028b5 100644 --- a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpOriginalImageAttribute.cs +++ b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/AbpOriginalImageAttribute.cs @@ -3,7 +3,7 @@ using System; namespace Volo.Abp.Image; [AttributeUsage(AttributeTargets.Parameter)] -public class AbpOriginalImageAttribute : Attribute +public class AbpOriginalImageAttribute : Attribute //TODO: Remove { public AbpOriginalImageAttribute(string parameter) { diff --git a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/IFormFileExtensions.cs b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/IFormFileExtensions.cs index 3f9f39fcaf..634727420a 100644 --- a/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/IFormFileExtensions.cs +++ b/framework/src/Volo.Abp.Image.Web/Volo/Abp/Image/IFormFileExtensions.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.Image; -public static class IFormFileExtensions +public static class IFormFileExtensions //TODO: Remove { public async static Task CompressImageAsync( this IFormFile formFile, diff --git a/framework/src/Volo.Abp.Image/Volo.Abp.Image.csproj b/framework/src/Volo.Abp.Image/Volo.Abp.Image.csproj index 3d13007579..eee78dbcd5 100644 --- a/framework/src/Volo.Abp.Image/Volo.Abp.Image.csproj +++ b/framework/src/Volo.Abp.Image/Volo.Abp.Image.csproj @@ -14,7 +14,6 @@ - \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeArgs.cs b/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeArgs.cs new file mode 100644 index 0000000000..5f7178c2d0 --- /dev/null +++ b/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeArgs.cs @@ -0,0 +1,19 @@ +namespace Volo.Abp.Image; + +public class ImageResizeArgs : IImageResizeParameter +{ + public int? Width { get; set; } + + public int? Height { get; set; } + + public ImageResizeMode? Mode { get; set; } //TODO: Set default here + + public ImageResizeArgs(int? width = null, int? height = null, ImageResizeMode? mode = null) + { + Mode = mode; + Width = width; + Height = height; + + //TODO: Throw exception if width/height is not null and negative + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeParameter.cs b/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeParameter.cs deleted file mode 100644 index ed5743c103..0000000000 --- a/framework/src/Volo.Abp.Image/Volo/Abp/Image/ImageResizeParameter.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Volo.Abp.Image; - -public class ImageResizeParameter : IImageResizeParameter -{ - public ImageResizeParameter(int? width = null, int? height = null, ImageResizeMode? mode = null) - { - Mode = mode; - Width = width; - Height = height; - } - - public int? Width { get; set; } - public int? Height { get; set; } - public ImageResizeMode? Mode { get; set; } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Image/Volo/Abp/Image/StreamExtensions.cs b/framework/src/Volo.Abp.Image/Volo/Abp/Image/StreamExtensions.cs index 7042a4fa7a..0e5f00c1f5 100644 --- a/framework/src/Volo.Abp.Image/Volo/Abp/Image/StreamExtensions.cs +++ b/framework/src/Volo.Abp.Image/Volo/Abp/Image/StreamExtensions.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.Image; -public static class StreamExtensions +public static class StreamExtensions //TODO: Remove { public static Stream CompressImage(this Stream stream, IImageFormat imageFormat, IImageCompressor imageCompressor) {