﻿
{"id":17580,"date":"2020-08-27T06:37:30","date_gmt":"2020-08-27T06:37:30","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17580"},"modified":"2020-08-27T06:37:30","modified_gmt":"2020-08-27T06:37:30","slug":"azure-functions-serisi-17-blob-trigger","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/azure-functions-serisi-17-blob-trigger\/","title":{"rendered":"Azure Functions Serisi #17 &#8211; Blob Trigger"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/azure-functions-yazi-serisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Azure Function yaz\u0131 serisi<\/a>nin onyedinci makalesinde trigger&#8217;lar aras\u0131nda en \u00e7ok kullan\u0131lanlardan biri olan Blob Trigger \u00fczerine odaklanacak, teorik ve pratik olarak t\u00fcm detaylar\u0131yla ele alaca\u011f\u0131z. <\/p>\n<h4 style=\"color: #e83e8c;\">Blob Trigger Nedir?<\/h4>\n<p>Blob trigger&#8217;\u0131n ne oldu\u011funu anlamak i\u00e7in tabi ki de Blob&#8217;un ne oldu\u011funu anlamak gerekmektedir. PDF, Image, MP3 vs. gibi yap\u0131land\u0131r\u0131lmam\u0131\u015f t\u00fcm dosyalara blob denmektedir. Azure Storage&#8217;lardan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/azure-storage-serisi-7-azure-blob-storage-ve-asp-net-core-ile-kullanimi\/\" rel=\"noopener noreferrer\" target=\"_blank\">Blob Storage<\/a> makalesini okursan\u0131z e\u011fer ilgili konuya dair daha detayl\u0131 bilgi edinebilirsiniz.<\/p>\n<h4 style=\"color: #e83e8c;\">Blob Trigger Olu\u015fturma<\/h4>\n<p>Blob Trigger&#8217;\u0131 Visual Studio \u00fczerinden a\u015fa\u011f\u0131daki gibi olu\u015fturabilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger.jpg\" alt=\"Azure Functions Serisi #17 - Blob Trigger\" width=\"942\" height=\"361\" class=\"aligncenter size-full wp-image-17587\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger.jpg 942w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-300x115.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-768x294.jpg 768w\" sizes=\"auto, (max-width: 942px) 100vw, 942px\" \/><\/a><br \/>\nSa\u011f taraftaki alanlar\u0131 s\u0131ras\u0131yla izah edersek e\u011fer;<\/p>\n<ul>\n<li><strong>Storage Account(AzureWebJobsStorage)<\/strong><br \/>\nBlob Trigger&#8217;\u0131n kullanaca\u011f\u0131 Azure Storage account&#8217;unu se\u00e7iniz.\n<\/li>\n<li><strong>Connection string setting name<\/strong><br \/>\nKullan\u0131lacak Azure Storage&#8217;\u0131n connection string de\u011ferini giriniz. E\u011fer bo\u015f ge\u00e7ersek default olarak local emulator&#8217;de ki storage&#8217;a ba\u011flant\u0131 sa\u011flanacakt\u0131r.\n<\/li>\n<li><strong>Path<\/strong><br \/>\nBlob Storage&#8217;da olu\u015fturulacak container&#8217;\u0131 belirtiniz.\n<\/li>\n<\/ul>\n<p>\u0130lgili alanlar doldurulup uygulama olu\u015fturuldu\u011fu zaman a\u015fa\u011f\u0131daki gibi bir function&#8217;la kar\u015f\u0131la\u015f\u0131lmaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Function1\r\n    {\r\n        &#x5B;FunctionName(&quot;Function1&quot;)]\r\n        public static void Run(&#x5B;BlobTrigger(&quot;samples-workitems\/{name}&quot;, Connection = &quot;AzureWebJobsStorage&quot;)]Stream myBlob, string name, ILogger log)\r\n        {\r\n            log.LogInformation($&quot;C# Blob trigger function Processed blob\\n Name:{name} \\n Size: {myBlob.Length} Bytes&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki function kodlar\u0131n\u0131 incelersek e\u011fer &#8216;AzureWebJobsStorage&#8217; connection string&#8217;i \u00fczerinden ba\u011flant\u0131 ger\u00e7ekle\u015ftirilmekte ve ilgili Blob Storage&#8217;da olmas\u0131 beklenen &#8216;samples-workitems&#8217; isimli container bu function taraf\u0131ndan dinlenmektedir. Ne zaman bu container&#8217;a bir dosya at\u0131lacak o zaman bu function tetiklenecek ve ekrana ilgili log&#8217;u basacakt\u0131r. Tabi function&#8217;\u0131 \u00f6zelle\u015ftirdi\u011finiz taktirde yapt\u0131\u011f\u0131n\u0131z i\u015f her ne ise o icra edilmi\u015f olacakt\u0131r. <\/p>\n<p>Uygulamay\u0131 hi\u00e7 dokunmadan derleyip, aya\u011fa kald\u0131rd\u0131\u011f\u0131m\u0131zda &#8216;samples-workitems&#8217; isimli container&#8217;\u0131 manuel olarak olu\u015fturup test etti\u011fimiz vakit a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fma g\u00f6zlenecektir&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger.gif\" alt=\"Azure Functions Serisi #17 - Blob Trigger\" width=\"800\" height=\"859\" class=\"aligncenter size-full wp-image-17591\" \/><\/a><\/p>\n<h4 style=\"color: #e83e8c;\">Blob Trigger&#8217;da Belirli Uzant\u0131l\u0131 Dosyalar\u0131 Dinlemek<\/h4>\n<p>Blog Trigger&#8217;da container&#8217;a y\u00fcklenen her dosyadan ziyade sadece belirli uzant\u0131l\u0131 dosyalar\u0131n dinlenilmesini ve sadece o dosyalarda tetiklenmesini istiyorsan\u0131z e\u011fer container&#8217;\u0131n bildirildi\u011fi parametrede &#8216;name&#8217; parametresinin uzant\u0131s\u0131n\u0131 a\u015fa\u011f\u0131daki gibi bildirmeniz gerekmektedir.<\/p>\n<div style=\"text-align:center;\"><code style=\"color:red;\">\"samples-workitems\/{name}.<span style=\"color:blue;\">{extension}<\/span>\"<\/code><\/div>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131daki fonksiyonu incelerseniz e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Function1\r\n    {\r\n        &#x5B;FunctionName(&quot;Function1&quot;)]\r\n        public static void Run(&#x5B;BlobTrigger(&quot;samples-workitems\/{name}.jpg&quot;, Connection = &quot;AzureWebJobsStorage&quot;)]Stream myBlob, string name, ILogger log)\r\n        {\r\n            log.LogInformation($&quot;C# Blob trigger function Processed blob\\n Name:{name} \\n Size: {myBlob.Length} Bytes&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sadece .jpg uzant\u0131l\u0131 dosyalarda tetiklenecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1.gif\" alt=\"Azure Functions Serisi #17 - Blob Trigger\" width=\"800\" height=\"842\" class=\"aligncenter size-full wp-image-17598\" \/><\/a><\/p>\n<h4 style=\"color: #e83e8c;\">Output Blob Binding \u0130le Resim Resize Edelim<\/h4>\n<p>\u015eimdi Blob Trigger&#8217;\u0131 kullanarak Output Blob Binding ile resim resize edecek \u00f6rnek bir uygulama geli\u015ftirelim. Senaryo olarak, x container&#8217;a y\u00fcklenen herhangi bir resim dosyas\u0131n\u0131n resize edilmi\u015f halini farkl\u0131 bir y container&#8217;\u0131na depolayan ve b\u00f6ylece ana uygulaman\u0131n i\u015flem maliyetini artt\u0131rmamak i\u00e7in bu i\u015flemi blob trigger ile sa\u011flayan bir function geli\u015ftirece\u011fiz.<\/p>\n<blockquote><p><em style=\"color:orange;\">Resim resize i\u015flemi i\u00e7in <a href=\"https:\/\/sixlabors.com\/\" rel=\"noopener noreferrer\" target=\"_blank\">Six Labors<\/a> k\u00fct\u00fcphanesini kullanabilirsiniz. Bknz : <a href=\"https:\/\/github.com\/sixlabors\" rel=\"noopener noreferrer\" target=\"_blank\">Github<\/a><\/em><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1.jpg\" alt=\"Azure Functions Serisi #17 - Blob Trigger\" width=\"501\" height=\"231\" class=\"aligncenter size-full wp-image-17605\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1.jpg 501w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-1-300x138.jpg 300w\" sizes=\"auto, (max-width: 501px) 100vw, 501px\" \/><\/a>\n<\/p><\/blockquote>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Function1\r\n    {\r\n        &#x5B;FunctionName(&quot;Function1&quot;)]\r\n        public async static Task Run(&#x5B;BlobTrigger(&quot;images\/{name}&quot;, Connection = &quot;AzureWebJobsStorage&quot;)] Stream myBlob, string name, ILogger log,\r\n            &#x5B;Blob(&quot;resize-images\/{name}&quot;, FileAccess.Write, Connection = &quot;AzureWebJobsStorage&quot;)] Stream outputBlob)\r\n        {\r\n            \/\/Gelen blob'un format\u0131 alg\u0131lan\u0131yor.\r\n            IImageFormat format = await Image.DetectFormatAsync(myBlob);\r\n            \/\/Blob resize ediliyor.\r\n            Image resizeImage = await Image.LoadAsync(myBlob);\r\n            resizeImage.Mutate(i =&gt; i.Resize(200, 200));\r\n            \/\/Ve Output Blob Storage'a \u00f6nceden tespit edilen format\u0131yla birlikte kaydediliyor.\r\n            resizeImage.Save(outputBlob, format);\r\n            log.LogInformation(&quot;Resim ba\u015far\u0131yla resize edilmi\u015ftir.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da geli\u015ftirilen function&#8217;\u0131 incelerseniz e\u011fer &#8216;images&#8217; container&#8217;\u0131n\u0131n i\u00e7erisine herhangi bir image dosyas\u0131 y\u00fcklendi\u011finde ilgili blob trigger tetiklenecek ve &#8216;resize-images&#8217; isimli bir ba\u015fka container i\u00e7erisine ilgili dosyan\u0131n 200&#215;200 px&#8217;lik boyutland\u0131r\u0131lm\u0131\u015f hali eklenecektir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/08\/Azure-Functions-Serisi-17-Blob-Trigger-2.gif\" alt=\"Azure Functions Serisi #17 - Blob Trigger\" width=\"800\" height=\"518\" class=\"aligncenter size-full wp-image-17609\" \/><\/a><\/p>\n<h4 style=\"color: #e83e8c;\">Container&#8217;a Bind Olma<\/h4>\n<p>Yukar\u0131daki \u00f6rne\u011fimizde Output Blob Binding ile bir Stream alarak tek bir blob \u00fczerinden \u00e7al\u0131\u015fma sergiledik. \u0130stersek bir container alabilir ve hatta o container&#8217;\u0131n var olup olmad\u0131\u011f\u0131n\u0131 do\u011frulayabilir ve kullanabiliriz. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public static class Function1\r\n    {\r\n        &#x5B;FunctionName(&quot;Function1&quot;)]\r\n        public async static Task Run(&#x5B;BlobTrigger(&quot;images\/{name}&quot;, Connection = &quot;AzureWebJobsStorage&quot;)] Stream myBlob, string name, ILogger log,\r\n            &#x5B;Blob(&quot;resize-images&quot;, Connection = &quot;AzureWebJobsStorage&quot;)] CloudBlobContainer cloudBlobContainer)\r\n        {\r\n            IImageFormat format = await Image.DetectFormatAsync(myBlob);\r\n            CloudBlockBlob cloudBlockBlob = cloudBlobContainer.GetBlockBlobReference($&quot;{Guid.NewGuid()}.{format.FileExtensions.First()}&quot;);\r\n            Image resizeImage = await Image.LoadAsync(myBlob);\r\n            resizeImage.Mutate(i =&gt; i.Resize(200, 200));\r\n            using MemoryStream memoryStream = new MemoryStream();\r\n            resizeImage.Save(memoryStream, format);\r\n            memoryStream.Position = 0;\r\n            await cloudBlockBlob.UploadFromStreamAsync(memoryStream);\r\n            log.LogInformation(&quot;Resim ba\u015far\u0131yla resize edilmi\u015ftir.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer; &#8216;Blob&#8217; attribute&#8217;unun &#8216;blobPath&#8217; parametresinden &#8216;name&#8217; parametresi kald\u0131r\u0131lm\u0131\u015ft\u0131r. Ayr\u0131ca container&#8217;a ba\u011flant\u0131 sa\u011flanaca\u011f\u0131ndan dolay\u0131 &#8216;FileAccess.Write&#8217; komutuda kald\u0131r\u0131lm\u0131\u015ft\u0131r. \u0130lgili attribute taraf\u0131ndan Stream yerine &#8216;CloudBlobContainer&#8217; t\u00fcr\u00fcnden bir de\u011fer i\u015faretlenmekte ve b\u00f6ylece &#8216;resize-images&#8217; container&#8217;\u0131na bind olunmaktad\u0131r. <em><strong>8.<\/strong><\/em> sat\u0131rda random bir isimde block blob olu\u015fturulmaktad\u0131r. <em><strong>11.<\/strong><\/em> sat\u0131rda ise gelen ve resize edilen blob&#8217;u memory&#8217;e atacak olan bir &#8216;MemoryStream&#8217; olu\u015fturulmu\u015ftur. En nihayetinde <em><strong>14.<\/strong><\/em> sat\u0131rda memory&#8217;de ki resize edilmi\u015f data upload edilmektedir.<\/p>\n<p>B\u00f6ylece Stream&#8217;e nazaran container \u00fczerinden birden fazla blob olu\u015fturularak i\u015flenebilme \u015fans\u0131 elde edilmektedir.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Azure Function yaz\u0131 serisinin onyedinci makalesinde trigger&#8217;lar aras\u0131nda en \u00e7ok kullan\u0131lanlardan biri olan Blob Trigger \u00fczerine odaklanacak, teorik ve pratik olarak t\u00fcm detaylar\u0131yla ele alaca\u011f\u0131z. Blob Trigger Nedir? Blob trigger&#8217;\u0131n ne oldu\u011funu anlamak&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":17011,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3121],"tags":[3686,3698,3697,3755,3756,3753,3757],"class_list":["post-17580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","tag-azure-function","tag-azure-function-blob-trigger","tag-blob-trigger","tag-blob-trigger-nedir","tag-image-resize","tag-output-blob-binding","tag-six-labors"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=17580"}],"version-history":[{"count":27,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17580\/revisions"}],"predecessor-version":[{"id":17612,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17580\/revisions\/17612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/17011"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=17580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}