Öğrencilerimin en sık sorduğu sorulardan biri de, veritabanında depolanmış resimleri web sayfasında nasıl gösterildiğidir. Internette bu konu hakkında zilyon tane yazı olmasına karşın bir tane yazma gereği hissettim.
Öncelikle anlaşılması gereken konu, html sayfalarında resim göstermenin ilk
koşulu resmin fiziksel yolunun kontrole yada etikete aktarılmasıdır.
Örneğin;
<
img src="/images/bullet.png" alt="Bullet" />
Diğer taraftan baktığımızda ki bu taraf veritabanı tarafıdır, resim gibi
içeriklerin hangi tip veri alanında saklanacağıdır.
C# ile yazılım geliştiryorsanız resim yada bir dosya serileştiğinde (yani
veritabına yazıldığında) byte dizisinden ibaret olacaktır.
Bu durumda en uygun alan tipi varbinary olsa iyi olur. :)
Kaçınılması gereken davranışlar.
<
yada
img1.ImageUrl = reader[1].ToString();hiç olmadı :)
img1.ImageUrl = command.ExecuteScalar().ToString();
Yapılması gereken gayet açık. Veritabınından okunan byte dizisini resim
formatında dışarı aktaracak (response) bir dosya (aspx,ashx)
oluşturmak ve oluşan dosyanın yolunu resmi gösterecek kontrol yada etikete
atamaktır.
Örnek tabloda gösterildiği gibi resim UrunResim alanında varbinary (byte dizisi) olarak saklanıyor.
Resmi oluşturacak resim.aspx sayfasına gönderilen parametre değeri ile veritabanında basit bir sorgu yapılarak ve sonucu byte dizisi olarak elde edilir.
protected void Page_Load(object sender, EventArgs e)Son olarak ise sayfa çıktısının resim olacağını işaret eder ve çıktıyı BinaryWriter metotu ile oluştururuz.
Peki bu kısma kadar database'den kontrol ettiğim 21KB lık resim.
byte[] resim = (byte[])com.ExecuteScalar();
con.Close();
Response.ContentType = "image/png";
Response.BinaryWrite(resim);
Bu aşamadan sonra nasıl 51 KB'ta kadar çıkıyor. Çözümü var mı?
Selam,
yorumdan sonra bir kez daha farklı formatlarda (jpeg,png) ve farklı veri alanlarında (varbinary, image vs) test ettim. Testler sırasınsa bir artışa rastlamadım.
Projeni ve tablo yapını info@ayrilmaz.com adresine gönderirsen belki biraz daha yardımcı olabilirim.