mehmetduran.com - Paylaşmak Güzeldir...
Asp.net ve Asp.net MVC'de Binary Olarak Dosya (Upload - Download) İşlemleri
Bu yazımda dosya upload ve kaydetme işlemlerinde dosya tipini binary olarak kullanmaktan bahsedeceğim. Bu konuyu hem Asp.net ile hem de MVC ile nasıl yapacağımızı göstereceğim. Asp.net ile hazırladığım örneği de sizlerle paylaşacağım. Uğraştığımız bir projede dosyaları binary olarak veritabanında tutmamız isteniyor. Daha önce yaptığım tüm uygulamalarda dosyaları bir hedefe upload edip, bilgilerini veritabanına kaydediyordum. Bu sefer dosyanın tamamını veritabanında tutuyoruz. Dosyaları güvenli bir biçimde muhafaza edebileceğimiz ancak veritabanında geniş yer tutan bir yöntem. Şimdi hem Asp.net hem de MVC için yazacağımız kodlara göz atalım.

Öncelikle verileri tutacağımız veritabanının yapısına bakalım. (Örnekte Access 2007 kullandım.)

Asp.net ve Asp.net MVC'de Binary Olarak Dosya (Upload) İşlemleriVeritabanında önemli olan veriler dosyanın adı, dosyanın tipi (mime type) ve dosyanın binary olarak karşılığı (Access'te binary verileri tutmak için sütunun tipi 'OLE Nesnesi' olmalıdır). Bu şekilde her türlü dosyayı veritabanımızda tutup, kullanıcılara sunabiliyoruz. Dosyalarımızı klasörde tutmaya göre daha güvenli bir biçimde muhafaza ediyoruz ama veritabanı daha çok yer istiyor. Ancak oldukça kullanışlı bir yöntem.

Öncelikle Asp.net örneğimizin kodlarına bakalım. Kodlarımız şöyle olmalı.

 
public partial class binaryUpload : System.Web.UI.Page
{
  OleDbConnection bg;
  protected void Page_Load(object sender, EventArgs e)
  {
    bg = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath("~/dosya.accdb") + "; Persist Security Info=False;");
  }
 
  // Kaydetme
  protected void btUpload_Click(object sender, EventArgs e)
  {
    if (FileUpload1.HasFile)
    {
      byte[] dosya_veri = FileUpload1.FileBytes;
      string tip = FileUpload1.PostedFile.ContentType;
      string adi = FileUpload1.FileName;
 
      string sorgu = "insert into DosyaBilgileri (DosyaAdi, DosyaTipi, Dosya) values(@DosyaAdi, @DosyaTipi, @Dosya)";
      OleDbCommand komut = new OleDbCommand(sorgu, bg);
      komut.Parameters.AddWithValue("@DosyaAdi", adi);
      komut.Parameters.AddWithValue("@DosyaTipi", tip);
      komut.Parameters.AddWithValue("@Dosya", dosya_veri);
      bg.Open();
      komut.ExecuteNonQuery();
      bg.Close();
    }
  }
 
  // Gösterme
  protected void btGoster_Click(object sender, EventArgs e)
  {
    string sorgu = "select top 1 * from DosyaBilgileri order by DosyaId desc";
    OleDbCommand komut = new OleDbCommand(sorgu, bg);
    bg.Open();
    OleDbDataReader oku = komut.ExecuteReader();
    oku.Read();
 
    byte[] dosya = (byte[])oku["Dosya"];
    string tip = (string)oku["DosyaTipi"];
    string adi = (string)oku["DosyaAdi"];
 
    Response.Clear();
    Response.ContentType = tip;
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + adi);
    Response.BinaryWrite(dosya);
 
    bg.Close();
  }
}
 

Asp.net için yazdığımız bu kodlarda öncelikle dosyamızı alıp binary olarak veritabanımıza kaydediyoruz. Ardından da kaydettiğimiz verileri alıp gösteriyoruz. (?) Aslında yazdığım kodlarda veritabanında tutulan dosya direk olarak indiriliyor. Eğer tarayıcı destekli bir dosya ise ve tarayıcıda dosyanın açılmasını istiyorsak Response.AppendHeader satırını kaldırmalıyız.

Asp.net MVC için Controller'da yazacağımız Actionmethod kodlarımız ise şu şekilde.

 
  byte[] binary_veriler;
  string tip, dosya_isim;
 
  [AcceptVerbs(HttpVerbs.Post)]
  public ActionResult BinaryUpload()
  {
    foreach (string isim in Request.Files)
    {
      var dosya = Request.Files[isim];
      tip = dosya.ContentType;
      dosya_isim = dosya.FileName;
      binary_veriler = new byte[dosya.ContentLength];
      dosya.InputStream.Read(binary_veriler, 0, dosya.ContentLength);
    }
 
    // burada binary veri içeren 'binary_veriler' değişkenini veritabanına kaydedebiliriz.
    // veritabanından alınan değeri byte dizisi bir değişkene atıp kullanabiliriz.
 
    return File(binary_veriler, tip, dosya_isim);
  }
 

MVC için yazdığım kodlar da Asp.net örneği ile aynı işleri yapmakta. MVC ile upload işlemleri için buradaki yazıma da göz atabilirsiniz.

Bu şekilde hem Asp.net hem de Asp.net MVC için binary olarak dosya upload ve download işlemlerini görmüş olduk.

Asp.net ile hazırladığım örneği buradan indirebilirsiniz.

Not : Ne edersen kendine edersin kendi kendine. (Anlayan anlar. ;))

İyi Çalışmalar.
Bookmark and Share
Bu Yazıyı Değerlendirin.
Konuyla İlgili Olabilecek Diğer Yazılar C# ile Extension Metot Yazma ve Kullanma (Lambda Expression Dahil) Jquery E-book Jquery ile Cookie İşlemleri XNA Game Studio Creator's Guide (E-Book) The Ultimate Css (E-Book)
Yorumlar
Yorum Yaz
RSS Yorum Takibi
Emre 27 Şubat Cumartesi 2010 18:22 #1
access 2007 bir proje yaptım. Local de gayet iyi çalıştı fakat servera atınca. Keyword not supported: 'provider'. diye bir hata verdi hiç karşılaştınız mı böyle bir sorunla ?
Mehmet Duran 27 Şubat Cumartesi 2010 23:34 #2
Bu sorunla Access 2007 kullanan ve hostta deneme yapan çoğu kişi karşılaşır. Ben de karşılaşmıştım. Bu sorun hostta Access 2007 için gereken kaynağın olmamasından kaynaklanıyor. Çözmek için ise host yetkilileri ile görüşmelisin. Onlar sorunu çözecektir. Eğer cevap alamazsan veya sorun devam ederse Access 2007 veritabanını 2003 formatında kaydederek deneyebilirsin.
Ercan 11 Ekim Pazartesi 2010 21:58 #3
Merhaba, binary olarak dosyaları tutmak güvenli midir? Dosya upload ve güvenliği konusunda biraz detaylı bilgi verirseniz sevinirim, iyi çalışmalar...
Mehmet Duran 13 Ekim Çarşamba 2010 16:27 #4
Dosyaları binary olarak tutmak dizinde tutmaktan daha güvenli sayılabilir. Ancak bu durum maliyeti artırır. Dizinde tutmak daha masrafsız ve hızlı olur. Uygulama ve uygulamanın önemine göre bu seçim yapılmalı. Ancak bana göre dizinde tutmak daha mantıklı gelmekte.
Ercan 13 Ekim Çarşamba 2010 22:04 #5
merhaba cevabınız için teşekkür ederim.Peki dosya konusunda alternatif güvenlik teknikleri mevcut mudur? Bilginiz var mı ya da bildiğiniz bir makale?
Mehmet Duran 14 Ekim Perşembe 2010 15:19 #6
@Ercan, dosyalaı koruma konusunda elbette birçok yöntem vardır ve gelişmeye de devam ediyordur. Sunucularda dosya saklanması ve paylaşımı konusunda daha fazla çalışma vardır. Basit olarak sunucu ayarları ile dosyaların dizinlerini ve kimlerin erişebileceği belirlense de direk olarak dosyalar üzerinde de işlemler yapılabilir. Ancak benim bu konuda herhangi bir araştırmam olmadı. Bu konuda daha detaylı bir araştırma yapmak gerekir diye düşünüyorum.
Ercan 17 Ekim Pazar 2010 22:14 #7
Peki hocam bu kaydı MsSQL de tutmak isteseydik, veritipimiz ne olmalıydı? tşk.
Mehmet Duran 18 Ekim Pazartesi 2010 15:54 #8
@Ercan, mssql'de bu türlü işlemler için binary, varbinary veri tipleri kullanılabilir.
Zehra 14 Ocak Cuma 2011 17:53 #9
Çoook teşekkür ediyorum 2 gündür veri tabanından resim çekmeye çalışıyorum ama bi türlü yapamamıştım.emeğinize sağlık
Serdar 18 Ocak Salı 2011 16:23 #10
Hocam merhaba, bunda dosyaları tuttuktan sonra indirirken örneğin metin belgesi txt olarak bir dosya download ettiğimiza bulunduğu sayfanının html özelliklerini de için ekleyerek indiriyor bilgisayara. Bunu nasıl çözebiliriz? Bir de asp.net sayfayı word,excel veya pdf olarak kaydetmek hakkında bir makalenizi dört gözle bekliyorum, iyi çalışmalar...
Mehmet Duran 04 Şubat Cuma 2011 15:25 #11
@Serdar, dosyaları tutarken kendi verisi yanında içerik tipinin ne olduğunu da tutmakta fayda var. Çünkü o dosyayı elde etmek istediğimizde tipini belirtmek durumundayız. Sayfaları çeşitli döküman tipine çevirmek için ücretli, ücretsiz araçlar mevcut. Onlarla çözülebileceğini düşünüyorum. Fırsat bulduğumda yazmaya çalışırım.
İsim :
Site :
Yorum :

Buradan bu yazıya ait yorumları RSS olarak takip edebilirsiniz.

Bu servis ile yazılara eklenen yorumları RSS ile takip ederek konu ile ilgili başkaları tarafından yapılan yorumları veya konuyla ilgili sorduğunuz sorulara verilen cevapları görebilirsiniz.
Şans bir uğraşının eseridir.
Bölümler
Yazılar
Arşiv
Arama
Linkler
Site İçi Arama
Son Zamanlarda Ne Yapıyorum ?
İstatistikler - Araçlar - Reklam
İstatistikler
Sayaç
Mehmet Duran | mehmetduran.com | Copyright © 2009