13 Ocak 2015 Salı

Windows Phone 8 ve 8.1 üzerinden Azure Blob Storage Üzerine Resim Kaydetme

     Merhabalar uzun süredir blog yazmadım ve çok az yazdığımın farkındayım :( Durdum durdum final haftasında sizlere bu yazıyı yazmaya karar verdim.

                                           Windows Phone 8 üzerinden Upload işlemi :)

    Ben Windows 10 üzerinde visual studio 2015 preview kullanıyorum ve uygulamaları buradan anlatıyor olacam. İlk olarak yeni wp8 uygulaması oluşturun MainPage.xaml içerisine bir Image nesnesi atın ve solution içerisinede bir resim atın. Daha sonra bu resmi Image üzerine atayın. Yani Source özelliğine yolu gösterin.

   Şimdi referanslara gelerek sağ tıklayıp Azure Storage referanslarını eklemek gerekiyor. Referanslara sağ tıklayıp Manage NuGet packages diyorum ve arama çubuğuna Azure Storage yazıyorum. Arama sonucu gelen ilk iki eleman bizim işimiz görecen ancak bir tanesini kullanmalıyım. Bu WindowsAzure.Storage olan referansı projeme yüklüyorum. 


                    


   Bu işlemleri başarılı bir şekilde yaptıktan sonra referanslar kısmında değişiklik olduğunu farkedeceksiniz. Şimdi geldi kod yazma olayına. Burada sizinle bir metod yazalım ve aşağıdaki gibi olsun. Daha sonra bu metodu butonumun click event'i içerisinde çağıralım.


async void UploadPhotoBytes(Image image, string UserNameToPhoto)
        {
            string accountName = "blob adı";
            string accountKey = "blob key";

            try
            {
                var credentilas = new StorageCredentials(accountName, accountKey);
                CloudStorageAccount account = new CloudStorageAccount(credentilas, false);
                CloudBlobClient client = account.CreateCloudBlobClient();
                CloudBlobContainer container = client.GetContainerReference("t2s");
                await container.CreateIfNotExistsAsync();

                BlobContainerPermissions containerPermissions = new BlobContainerPermissions() { PublicAccess = BlobContainerPublicAccessType.Blob };
                await container.SetPermissionsAsync(containerPermissions);

                CloudBlockBlob blockBlob = container.GetBlockBlobReference(UserNameToPhoto + ".png");

                var bitImage = new WriteableBitmap(image, null);
                var stream = new MemoryStream();
                bitImage.SaveJpeg(stream, bitImage.PixelWidth, bitImage.PixelHeight, 0, 100);

                byte[] dizi = stream.GetBuffer();

                await blockBlob.UploadFromByteArrayAsync(dizi, 0, dizi.Length);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Metodumuzu yazdık ve açıklayalım hemen ne yaptığımızı. Baştaki string değerler aşağıdaki resimdeki değerlerdir.


var credentilas = new StorageCredentials(accountName, accountKey);
CloudStorageAccount account = new CloudStorageAccount(credentilas, false);

Yukarıdaki tanımalanan iki string değere göre account kontrolünüzü yapar.

 CloudBlobClient client = account.CreateCloudBlobClient();

Bu kod ise bloba bağlanmanız için bir client oluşturur.

 CloudBlobContainer container = client.GetContainerReference("t2s");
 await container.CreateIfNotExistsAsync();

Bu kod parçacığı ise blobunuz içerisinde bir Container lara bakar ve var olup olmadığna göre oluşturur veya oluşturmaz.


 BlobContainerPermissions containerPermissions = new BlobContainerPermissions() {  PublicAccess = BlobContainerPublicAccessType.Blob };
 await container.SetPermissionsAsync(containerPermissions);

Yukarıdaki kod sizin konteynırınızın izinidir ve izin vermenizi yada yeni izinler oluşturmanızı sağlar.

 var bitImage = new WriteableBitmap(image, null);
 var stream = new MemoryStream();
 bitImage.SaveJpeg(stream, bitImage.PixelWidth, bitImage.PixelHeight, 0, 100);
 byte[] dizi = stream.GetBuffer();

Yukarıdaki kod ise sizin resminizi upload etmeden önce byte dizisine çevirmenizi sağlar.

await blockBlob.UploadFromByteArrayAsync(dizi, 0, dizi.Length);

Bu son kod ise resimden oluşan byte dizinizi azure blob storage üzerindeki konteynırınıza upload etmenizi sağlar.

Önemli: Windows Phone 8 ve Windows Phone 8.1 üzerinden Azure'a resim upload ederken direkt olarak bir Task(PhotoChoiserTask ya da CamereCaptureTask) üzerinden alacağınız stream'i upload edemiyorsunuz sürekli olarak resmin dosya yolunu reddediyor. Bunun sebebini bilmiyorum çözemedim ama bu yazıyı yazarken aklıma bişeyler gelmedi değil :)) dener tekrardan sizlere paylaşırım.

Windows Phone 8.1 üzerinden Upload işlemine gelelim şimdi :)

Yine buradada bir metod yazıp butonumuzun Click Eventinde çağıralım. Tabi burada yeni wp8.1 uygulaması oluşturmam gerekiyor :)

async void UploadPhotoBytes()
        {
            string accountName = "";
            string accountKey = "";

            try
            {
                var credentilas = new StorageCredentials(accountName, accountKey);
                CloudStorageAccount account = new CloudStorageAccount(credentilas, false);
                CloudBlobClient client = account.CreateCloudBlobClient();
                CloudBlobContainer container = client.GetContainerReference("t2s");


                BlobContainerPermissions containerPermissions = new BlobContainerPermissions() { PublicAccess = BlobContainerPublicAccessType.Blob };
                await container.SetPermissionsAsync(containerPermissions);

                CloudBlockBlob blockBlob = container.GetBlockBlobReference("resmime vereceğim isim.png");


                var folder = KnownFolders.CameraRoll;
                var file = await folder.GetFileAsync("thaldi.jpg");
                var data = await FileIO.ReadBufferAsync(file);
                byte[] dizii = data.ToArray();
             

                await blockBlob.UploadFromByteArrayAsync(dizii, 0, dizii.Length);

                var dialog = new MessageDialog("yüklendi");
                await dialog.ShowAsync();

            }
            catch (Exception ex)
            {
                var dialog = new MessageDialog("yüklenmedi\n" + ex.Message);
                await dialog.ShowAsync();
            }
        }

Burada farklı olan iki nokta var birincisi resmi solutiondan değil telefon içerisindeki yani uygulamayı çalıştıracapım telefon içerindeki bir resmi upload etmem ve seçmem ikincisi ise resmi byte dizisine çevirme işlemi.

 var folder = KnownFolders.CameraRoll;
 var file = await folder.GetFileAsync("thaldi.jpg");

Yukardaki kod benim telefonum içerisindeki varsayılan olarak oluşturulmuş dosyalara erişmemi ve içerisinde var olan bir resmi(thaldi.jpg) seçmemi sağlıyor.

var data = await FileIO.ReadBufferAsync(file);
byte[] dizii = data.ToArray();

Bu kod ise aldığım resmi byte dizisine çevirmemi sağlıyor. Diğer kısımlarda değişiklik yok.

     Peki bu değişikliklerin sebebi nedir diyecek olursak bazı kütüphaneler wp8 ve wp8.1 için ortak değiller WritableBitmap nesnesini burada referans olarak gösterebiliriz.


Umarım işinize yarar bir sonraki yazıda görüşmek üzere(hep böyle söyleyip aylar sonra yazıyorum :D). Sürçü lisan eylediysem affola.

İyi haftalar ve finaller diliyorum öğrenci kardeşlerim ;)



Share:

0 yorum:

Yorum Gönder