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)); } } }
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))); } }
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; } }