public static ConvertionOptions FromResizeRequest(ResizeRequestModel requestModel)
        {
            var options = new ConvertionOptions
            {
                Name = requestModel.Name
            };

            if (requestModel.Width.HasValue && requestModel.Width > 0)
            {
                options.Width = Math.Min(requestModel.Width.Value, ConvertionOptions.MaxSize);
            }

            if (requestModel.Height.HasValue && requestModel.Height > 0)
            {
                options.Height = Math.Min(requestModel.Height.Value, ConvertionOptions.MaxSize);
            }

            options.TargetFormat = GetMagickFormat(requestModel.Format);

            if (requestModel.Quality.HasValue && requestModel.Quality.Value >= 1 && requestModel.Quality.Value <= 100)
            {
                options.Quality = requestModel.Quality.Value;
            }
            else
            {
                options.Quality = options.TargetFormat == MagickFormat.Png24 ? 100 : 82;
            }

            return(options);
        }
        public async Task <IActionResult> ResizeImage(
            [FromQuery] ResizeRequestModel requestModel,
            [FromServices] IWebHostEnvironment env,
            [FromServices] StorageService storage,
            [FromServices] ImageConverter converter
            )
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            (var fileExists, var blobFile) = await storage.TryGetFile(requestModel.Name);

            if (!fileExists)
            {
                return(NotFound());
            }

            var options     = ConversionOptionsFactory.FromResizeRequest(requestModel);
            var imageSource = await storage.GetBlobBytes(blobFile);

            var result = await converter.Convert(imageSource, options);

            if (result.Length == 0)
            {
                return(BadRequest("Could not convert file."));
            }

            return(File(result, options.TargetMimeType));
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> ResizeImage(
            [FromQuery] ResizeRequestModel requestModel,
            [FromServices] IHostingEnvironment env,
            [FromServices] StorageService storage,
            [FromServices] ImageConverter converter
            )
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var options = ConversionOptionsFactory.FromResizeRequest(requestModel);

            (var cacheExists, var cacheFile) = await storage.TryGetFileCached(options.GetCacheKey());

            if (cacheExists)
            {
                // validar Etag
                if (IsEtagNotModified(Request, cacheFile.Properties.ETag))
                {
                    return(new NotModifiedResult(
                               cacheFile.Properties.LastModified.GetValueOrDefault().UtcDateTime,
                               cacheFile.Properties.ETag));
                }

                var cacheContent = await storage.GetBlobBytes(cacheFile);

                return(File(cacheContent, cacheFile.Properties.ContentType,
                            cacheFile.Properties.LastModified.GetValueOrDefault().UtcDateTime,
                            new EntityTagHeaderValue(cacheFile.Properties.ETag)));
            }

            (var fileExists, var blobFile) = await storage.TryGetFile(requestModel.Name);

            if (fileExists == false)
            {
                return(NotFound());
            }

            var imageSource = await storage.GetBlobBytes(blobFile);

            var result = await converter.Convert(imageSource, options);

            if (result.Length == 0)
            {
                return(BadRequest("Could not convert file."));
            }

            // Salvar a imagem convertida em um blob separado
            (var uploadOk, var savedFile) = await storage.TryUploadToCache(options.GetCacheKey(),
                                                                           result, options.TargetMimeType);

            return(File(result, savedFile.Properties.ContentType,
                        savedFile.Properties.LastModified.GetValueOrDefault().UtcDateTime,
                        new EntityTagHeaderValue(savedFile.Properties.ETag)));
        }