Anasayfa Hakkımda İletişim RSS
Site İçi Arama
ETİKET BULUTU
SON YAZILAR
Artık Bir Mezunum..
Gazi Üniversitesi Bilişim Ve Kariyer Günleri
Google' dan Çılgın Proje
Amfiden Ofise
ASP.NET ile Dinamik Meta Tag Oluşturma
EN ÇOK OKUNANLAR
C# ile Thread Kullanımı
ASP.NET ile Dinamik Meta Tag Oluşturma
Haymana'ya İsmini Veren Hayme Ana Kimdir?
ASP.NET ile Resimleri Binary olarak Saklamak ve Handler ile
Virtual Earth ile Verilen Koordinatlara Göre Harita Üzerinde
SON YORUMLANANLAR
Artık Bir Mezunum..
ASP.NET ile Resimleri Binary olarak Saklamak ve Handler ile
Google' dan Çılgın Proje
Mutlu Yıllar, Hoşgeldin 2010
TAKİP ETTİKLERİM
Mehmet Duran
Oğuz Yılmaz
Alper Öcalan
İsmail Öz
Yakup Buğra
Alp Çoker
Daron Yöndem
Nuh Azgınoğlu
Gökhan Besler
İSTATİSTİKLER
YAZILAR
Toplam Yazı: 17
Toplam Yorum: 32
Toplam Etiket: 26
ZİYARETÇİLER
Online: 1
Bugün: 47
Bu Ay: 535
Bu Yıl: 25546
Toplam: 33139


ASP.NET ile Resimleri Binary olarak Saklamak ve Handler ile Göstermek

Bazen yaptığımız sitelerde resimlerin bulunduğu klasörlere kimsenin ulaşmamasını isteriz. Çok çeşitli saklama yolları deneriz. Bunlardan birisi de veritabanında binary olarak resimlerin veya dosyaların saklanmasıdır. Ben size küçük bir örnek ile resimlerin binary olarak kaydedilmesi ve tekrar gösterilmesini anlatacağım. İlk önce aşağıdaki gibi veritabanımızı oluşturuyoruz. Resim alanını binary data alacak şekilde veritabanımıza göre ayarlıyoruz.



Veritabanımızı oluşturduktan sonra sıra geldi seçilen resmin veritabanına binary olarak eklenmesine. Bunun için gerekli kodlarımız şu şekildedir.

if (FileUpload1.HasFile)
{
                        byte[] resim = FileUpload1.FileBytes;
                        string tip = FileUpload1.PostedFile.ContentType;
                        string adi = FileUpload1.FileName;
                        string sorgu = "insert into ResimBilgileri (ResimAdi, ResimTipi, Resim) values(@ResimAdi, @ResimTipi, @Resim)";
                        OleDbCommand komut = new OleDbComman(sorgu,bg);                                       
                  komut.Parameters.AddWithValue("@ResimAdi", adi);
 
                  komut.Parameters.AddWithValue("@ResimTipi", tip);
                 
komut.Parameters.AddWithValue("@Resim", resim);
                       bg.Open();
                       komut.ExecuteNonQuery();
                       bg.Close();
}

FileUpload kontrolümüzden seçilen resmi binarye çevirerek veritabanımıza ekliyoruz. Resmin tipini ve isminide FileUpload kontrolünün özelliklerinden faydalanarak alıyoruz ve veritabanına ekliyoruz.
Sıra geldi bu resmin binary olarak çekilmesine ve gösterilmesine, bunun için bir tane Handler dosyası kullanıyoruz. Başka türlü de çekilebilir fakat hem kolaylık olsun diye hem de Hanler kullanımını görmemiz açısından bunu tercih ettim.
Resmi göstereceğimiz image kontrolüne Handlerimizi yol olarak gösteriyoruz. Kontrol yüklendiğinde otomatik olarak Handlerimiz çalışarak resmimiz veritabanından çekilecektir.
      Image1.ImageUrl ="Handler.ashx";
kod parçası ile Handlerimizi kontrolümüze yol olarak verdik.
Şimdi de "Handler.ashx" dosyamızda neler varmış görelim.

    public class Handler : IHttpHandler,IRequiresSessionState {
    public void ProcessRequest (HttpContext context) {
        OleDbConnection bg = new OleDbConnection(".....");
        int resim_id=(int)context.Session["Resimid"];
        MemoryStream memoryStream = new MemoryStream();
        string sorgu = "select * from ResimBilgileri where Resimid=@Resimid";
        DataTable tablo = new DataTable();
        OleDbDataAdapter adp = new OleDbDataAdapter(sorgu, bg);
        adp.SelectCommand.Parameters.AddWithValue("@Resimid", resim_id);
        adp.Fill(tablo);
        byte[] dosya = (byte[])tablo.Rows[0]["Resim"];
        string tip =tablo.Rows[0]["ResimTipi"].ToString();
        string adi = tablo.Rows[0]["ResimAdi"].ToString();
        memoryStream.Write(dosya, 0, dosya.Length);
        context.Response.Buffer = true;
        context.Response.BinaryWrite(dosya);
        memoryStream.Dispose(); 
}

Şimdi kodumuzu kısaca açıklayalım. Handler kullanırken ben resim_id olarak sessiondan bir değer aldım, çünkü genelde parametre ile resim çekildiği için bu konuyada değinmek istedim. Bende ilk kullandığımda sessiondan veya başka bir sınıftan parametre taşıyıp alamıyordum. İnternette araştırma yaptıktan sonra gördüm ki IRequiresSessionState kodunu miras olarak aldırmadan sessionla veri taşınamıyormuş Bu yüzden sizde kullanırken IRequiresSessionState kodunu eklemeyi unutmayınız. Sessiondan gelen id ye göre dosyamızı veritabanından çekiyoruz. Bunun için MemoryStream sınıfını kullanmak gerekiyor. Bizde oluşturduğumuz dosya nesnesine veritabanındaki resim bilgilerini ekleyerek Handlerin buffer özelliği ile resmimizi ekrana yazdırmış olduk. Hanler kullanımı ile ilgili ileriki zamanlarda örnekler vereceğim. İnşallah faydalı olmuştur. Resimlerini saklamak isteyenler için güzel bir yöntem. Bunun gibi başka dosyaları da veritabanınızda binary olarak saklayıp indirme yapabilirsiniz.

Tarih: 02.10.2009 Okunma Sayısı: 786 Yorum Sayısı: 2
Etiketler: ASP.NET Generic Handler
YORUMLAR
kis 01.06.2010
muti
kis ağzınıza sağlık co güzel olmuş fakat ben bunu gridview de görüntülemek istyorum nasıl yapabilirim veri tabanına binary olarak kaydettim resimleri.
kis 15.06.2010
Sinan Özkan
kis Gridwiev kontrolü içerisine bir image kontrolü koyarak yolunu generic handler dosyamıza gönderebiliriz yani src="Handler.ashx?ResimId=1" şeklinde adresi vererek generic handler sayfasında url den id alıp binary dosyayı örnekteki gibi çekmek yeterli. Yani sadece yolunu vereceksin ve adresten parametreyi alacaksın. Tabi gridwiev içine kontrolü html tarafından ekleyebilirsin ya da kod tarafından image kontrolü oluşturup bir sütuna ekleyebilirsin.
YORUM YAZ

İSİM:
YORUM:


Copyright © 2009 SİNAN ÖZKAN