27 Kasım 2011 Pazar

Asp.net Ajax AsyncFileUpload

   AsyncFileUpload dosyaları sunucuya senkron bir şekilde göndermenizi sağlayan bir ASP.NET Ajax kontrolüdür. Dosya yükleme işleminin sonuçları hem sunucu hem de istemci tarafında kontrol edilebilir.

Olaylar 
  • UploadComplete - Dosya başarılı bir şekilde yüklendiğinde sunucu tarafında meydana gelir.
  • UploadedFileError - Yüklenen dosya bozulduğunda sunucu tarafında meydana gelir.
Özellikleri
  • CompleteBackColor - Yükleme tamamlandığında kontrolün arkaplan rengidir. Varsayılan değeri 'Lime'.
  • ContentType - İstemciden gönderilen dosyanın MIME içerik tipi bilgisini getirir. (Örneğin : image/jpeg)
  • ErrorBackColor - Dosya gönderildiğinde hata oluşursa kontrolün arkaplan rengi. Varsayılan değeri 'Red'.
  • FileContent - Yüklenen bir dosyanın içindekileri okuyabilmek için hazır hale getirmeye yarayan bir stream nesnesi getirir.
  • FileName - İstemci tarafından yüklenen dosyanın adını getirir.
  • HasFile - Kontrolün bir dosya içerip içermediği bilgisini gösterir. Bool değer alır(True/False) Dosya varsa true, yoksa false değeri döndürür.
  • OnClientUploadComplete - Belirtilen javascript fonksiyonu yükleme işlemi başarılı bir şekilde tamamlandıktan sonra çalıştırılır. Örneğin : OnClientUploadComplete = "bitti"
 <script type="text/javascript">
            function bitti() {
                alert("Yükleme işlemi başarılı bir şekilde tamamlandı.");
            }
 </script>
  • OnClientUploadError - İstemci tarafında çalışan javascript fonksiyonunun adını alır. Yükleme işlemi sırasında bir hatayla karşılaşılmışsa çalıştırılır. Örneğin : OnClientUploadError = "hata"
 <script type="text/javascript">
             function hata() {
                alert("Yükleme işlemi sırasında hata meydana geldi.");
            }
 </script>

  • OnClientUploadStarted - Yükleme işlemi başladığında çalıştırılacak javascript fonksiyonunun adını alır. Örneğin : OnClientUploadStarted = "YuklemeBasladi"
 <script type="text/javascript">
             function YuklemeBasladi() {
                alert("Yükleme işlemi başladı.");
            }
</script>

  • PostedFile - Yüklenen dosyaya erişimi sağlayan bir HttpPostedFile nesnesini döndürür.
  • ThrobberID - Dosya yüklenirken gösterilen kontrolün ID değeridir. Örneğin : 

<asp:AsyncFileUpload ID="AsyncFileUpload2" runat="server" 
            onclientuploadcomplete="bitti" 
            onuploadedcomplete="AsyncFileUpload2_UploadedComplete" 
            onclientuploaderror="hata" onclientuploadstarted="YuklemeBasladi" 
            ThrobberID="Image1" />
<asp:Image ID="Image1" runat="server" ImageUrl="~/Resimler/ajax-loader.gif" />

  • UploaderStyle - Kontrolün görüntü sitilidir. 2 farklı değer alabilir. Traditional ve Modern. Varsayılan değeri : 'Traditional'.
 Traditional

               Modern
  • UploadingBackColor - Kontrol upload(yükleme) işlemi yaparken arkaplan rengidir. Varsayılan değeri 'White(beyaz)'.
  • Width - Kontrolün genişlik değeridir. Varsayılan değeri '355' piksel.
Metodlar
SaveAs(string filename) - Yüklenen bir dosyanın içindekileri kaydeder.

Yüklenen Resmi Kayıt Etme

protected void AsyncFileUpload1_UploadedComplete
 (object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{  
  if (AsyncFileUpload1.HasFile)
  {
    string strPath = MapPath("~/Uploads/") + Path.GetFileName(e.filename);
    AsyncFileUpload1.SaveAs(strPath);
  }
}
   Emin olmamakla birlikte AsyncFileUpload kontrolü büyük ihtimal dosyayı öncelikle sunucunun belleğine yüklüyor. Ardından da yukarıdaki SaveAs komutu ile ilgili klasöre kayıt ediyor. Eğer dosyayı veritabanına kaydetmek istiyorsanız dosyanın adını(AsyncFileUpload1.FileName) kaydederek ilgili resime ihtiyacınız olduğunda ulaşabilirsiniz. Örneğin bir ImageField alanında bir resmi göstermek istiyorsanız Eval("profilFotograf", "~/Uploads/{0}") şeklinde bağlayarak gösterebilirsiniz. profilFotograf alanı veritabanından gelecektir ve ilgili dosyanın adını uzantısıyla birlikte getirecektir. Örneğin : "kalem.jpg" şeklinde.

NOT : Dosyayı klasöre kayıt etmeden önce klasörün yazma izni olup olmadığını kontrol ediniz. Aksi taktirde hata ile karşılaşabilirsiniz.

Dosyanın Uzantısını Kontrol Etme

   AsyncFileUpload kontrolü ile dosya yüklerken dosyanın uzantısını kontrol etmek isteyebiliriz. Bunun için farklı yoller denemek mümkün. Aşağıda dosya formatının resim olup olmadığı kontrol ediliyor. Eğer resim formatındaysa kayıt işlemi gerçekleşiyor.
protected void AsyncFileUpload1_UploadedComplete
 (object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{  
  if (AsyncFileUploadProfilFotografDuzenle.ContentType.Split('/').Contains("image"))
  {
    string strPath = MapPath("~/Uploads/") + Path.GetFileName(e.filename);
    AsyncFileUpload1.SaveAs(strPath);
  }                
  else
  {
     Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Success", "<script        type='text/javascript'>alert('Dosya resim formatında olmalı. (jpeg, jpg, png vs.)');</script>");
}

Dosyanın Boyutunu Kontrol Etmek


protected void AsyncFileUpload1_UploadedComplete
 (object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
{  
  if (AsyncFileUploadProfilFotografEkle.PostedFile.ContentLength > 1024000)
                    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Success", "<script type='text/javascript'>alert('Dosyanın boyutu en fazla 1 mb olabillir.');</script>");
}

   Bir uygulama tasarlarken belleği etkin kullanmak temel ilkelerden biridir. Sunucumuzdaki alan sınırlıdır. Bu yüzden de bazı dosyaların boyutuna sınırlar getirildiğini internetteki pek çok sitede görebilirsiniz. Burada dosyanın maksimum boyutunu 1mb = 1024000 byte olarak belirledik. Siz bu değeri istediğiniz gibi değiştirebilirsiniz.

Yüklenen Bir Dosyayı Silmek


SqlConncetion   baglanti = new SqlConnection(WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);  // Bağlantı cümlesi
   
baglanti.Open();  
            SqlCommand komut = new SqlCommand("select ResimAd from Resim where ResimNo = " + Session["ResimNo"] + "", baglanti);
            SqlDataReader reader = komut.ExecuteReader();
            if (reader.Read())
            {
                string ResimAd = reader["ResimAd"].ToString();
                if (String.IsNullOrEmpty(ResimAd) == false)
                {
                    System.IO.File.Delete(Server.MapPath("~/Resimler/" + ResimAd));
                }
            }
            baglanti.Close();


  Bazen yüklediğimiz dosyayı silmek isteyebiliriz. Yukarıda veritabanından silmek istediğimiz dosyanın adını getirip ilgili klasörden nasıl silebileceğimizi gördük. Resim dosyası haricinde diğer dosyalar için de aynı kodları ve mantığı kullanabilmek mümkün. AsyncFileUpload kontrolüyle yeni bir dosya yüklendiğinde de eski dosya varsa silinmesini isteyebiliriz. Bunun için yukarıdaki kodları UploadedComplete yordamının içine eklemeniz yeterli olacaktır. Tabi yeni dosya adını da veritabanına eklemeyi unutmuyoruz.


 Not: Bazı durumlarda herhangi bir hata mesajıyla karşılaşmamamıza rağmen dosya yükleme işlemi gerçekleşmeyebilir. Bu durumda muhtemelen sayfanızda bir hata var demektir. UpdatePanel içerisindeki kontrollerinizde hata olduğunda hata mesajı almayabiliyorsunuz. Böyle bir durumla karşı karşıya kalırsanız sayfanızı tekrar gözden geçirin