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.