示例#1
0
        public static async Task <IActionResult> RunDocumentImageAsync(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = UrlConst.ImageFunctionDocumentRoute)]
            HttpRequest req, long id,
            IBinder binder,
            //collector search duplicate so i added some search 3 to solve this
            [Queue("generate-blob-preview")] IAsyncCollector <string> collectorSearch3,
            Microsoft.Extensions.Logging.ILogger logger,
            [Blob("spitball-files/files/{id}/preview-0.jpg")] CloudBlockBlob blob,
            CancellationToken token)
        {
            var mutation = ImageMutation.FromQueryString(req.Query);

            try
            {
                await using var sr = await blob.OpenReadAsync();

                var image = ProcessImage(sr, mutation);
                return(new ImageResult(image, TimeSpan.FromDays(365)));
            }
            catch (ImageFormatException ex)
            {
                logger.LogError(ex, id.ToString());
                return(new RedirectResult(blob.Uri.AbsoluteUri));
            }
            catch (StorageException e)
            {
                if (e.RequestInformation.HttpStatusCode != (int)HttpStatusCode.NotFound)
                {
                    throw;
                }
                var t1 = collectorSearch3.AddAsync(id.ToString(), token);


                var directoryBlobs = await
                                     binder.BindAsync <IEnumerable <ICloudBlob> >(new BlobAttribute($"spitball-files/files/{id}"), token);

                var blobPath      = "spitball-user/DefaultThumbnail/doc-preview-empty.png";
                var fileBlob      = directoryBlobs.FirstOrDefault(f => f.Name.Contains("/file-"));
                var blobExtension = Path.GetExtension(fileBlob?.Name)?.ToLower();

                if (blobExtension != null && FileTypesExtensions.FileExtensionsMapping.TryGetValue(blobExtension, out var val))
                {
                    blobPath = $"spitball-user/DefaultThumbnail/{val.DefaultThumbnail}";
                }

                var t2 = binder.BindAsync <Stream>(new BlobAttribute(blobPath, FileAccess.Read),
                                                   token);
                await Task.WhenAll(t1, t2);

                using (t2.Result)
                {
                    var image = ProcessImage(t2.Result, mutation);
                    return(new ImageResult(image, TimeSpan.Zero));
                }
            }
        }
示例#2
0
        public static async Task <IActionResult> RunUserImageAsync(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = UrlConst.ImageFunctionUserRoute)]
            HttpRequest req, long id, string file,
            [Blob("spitball-user/profile/{id}/{file}")] CloudBlockBlob blob,
            Microsoft.Extensions.Logging.ILogger logger
            )
        {
            var regex    = new Regex(@"[\d]*[.]\D{3,4}");
            var isBlob   = regex.IsMatch(file);
            var mutation = ImageMutation.FromQueryString(req.Query);

            if (isBlob)
            {
                try
                {
                    mutation.CenterCords = await GetCenterCordsFromBlob(blob);

                    await using var sr = await blob.OpenReadAsync();

                    var image = ProcessImage(sr, mutation);
                    return(new ImageResult(image, TimeSpan.FromDays(365)));
                }
                catch (ImageFormatException ex)
                {
                    logger.LogError(ex, $"id: {id} file {file}");
                    return(new RedirectResult(blob.Uri.AbsoluteUri));
                }
                catch (StorageException e)
                {
                    if (e.RequestInformation.HttpStatusCode == (int)HttpStatusCode.NotFound)
                    {
                        return(GenerateImageFromName());
                    }

                    throw;
                }
            }

            return(GenerateImageFromName());

            IActionResult GenerateImageFromName()
            {
                var image = GenerateImageFromText(file, new Size(mutation.Width, mutation.Height));

                return(new ImageResult(image, TimeSpan.FromDays(30)));
            }
        }
示例#3
0
        public static async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "image/{hash}")]
            HttpRequest req, string hash,
            IBinder binder,
            [Queue("generate-blob-preview")] IAsyncCollector <string> collectorSearch,
            Microsoft.Extensions.Logging.ILogger logger,
            [Inject] IBinarySerializer serializer,
            CancellationToken token)
        {
            if (string.IsNullOrEmpty(hash))
            {
                return(new BadRequestResult());
            }

            var hashBytes = Base64UrlTextEncoder.Decode(hash);

            var properties = serializer.Deserialize <ImageProperties>(hashBytes);

            var mutation = ImageMutation.FromQueryString(req.Query);


            var blob = await binder.BindAsync <CloudBlockBlob>(new BlobAttribute(properties.Path, FileAccess.Read),
                                                               token);

            var blobExtension = Path.GetExtension(blob.Name)?.ToLower();

            if (blobExtension != null && FileTypesExtensions.FileExtensionsMapping.TryGetValue(blobExtension, out var val))
            {
                //This is for chat
                //if (blob.Container.Name == StorageContainer.Chat.Name && )
                if (val.DefaultThumbnail != FileTypesExtension.Image.DefaultThumbnail)
                {
                    var blobPath = $"spitball-user/DefaultThumbnail/{val.DefaultThumbnail}";
                    blob = await binder.BindAsync <CloudBlockBlob>(new BlobAttribute(blobPath, FileAccess.Read),
                                                                   token);
                }
            }

            mutation.BlurEffect = properties.Blur.GetValueOrDefault();
            try
            {
                using (var sr = await blob.OpenReadAsync())
                {
                    mutation.CenterCords = await GetCenterCordsFromBlob(blob);

                    var image = ProcessImage(sr, mutation);
                    return(new ImageResult(image, TimeSpan.FromDays(365)));
                }
            }
            catch (ImageFormatException ex)
            {
                logger.LogError(ex, hash);
                return(new RedirectResult(blob.Uri.AbsoluteUri));
            }
            catch (StorageException e)
            {
                if (e.RequestInformation.HttpStatusCode != (int)HttpStatusCode.NotFound)
                {
                    throw;
                }
                if (string.Equals(blob.Container.Name, StorageContainer.File.Name,
                                  StringComparison.OrdinalIgnoreCase))
                {
                    var t1 = collectorSearch.AddAsync(
                        blob.Parent.Prefix.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries).Last(), token);
                    const string blobPath = "spitball-user/DefaultThumbnail/doc-preview-empty.png";
                    var          t2       = binder.BindAsync <Stream>(new BlobAttribute(blobPath, FileAccess.Read),
                                                                      token);
                    await Task.WhenAll(t1, t2);

                    using (t2.Result)
                    {
                        var image = ProcessImage(t2.Result, mutation);
                        return(new ImageResult(image, TimeSpan.Zero));
                    }
                }

                throw;
            }
        }