🗄️ Oracle BLOB’u ASPX ile Yönetmek: Kaydet ve İndir

Oracle’daki BLOB (Binary Large Object) alanları; PDF, resim, Word veya herhangi bir binary dosyayı saklamak için birebirdir. Ancak .NET tarafında bu verileri doğru türde (byte[]) yönetmek şarttır. İşte adım adım yapmanız gerekenler:

  1. 📥 Veritabanından BLOB Okuma (Fetch)

Altın Kural: BLOB’u asla string olarak çekmeyin! Doğrudan byte[] olarak alın.

Dapper ile:

byte[] fileData = connection.QueryFirstOrDefault<byte[]>(
    "SELECT BLOB_KOLON FROM DOSYALAR WHERE ID = :id", new { id = dosyaId });

Entity Framework ile (Modelde byte[] tanımlıysa):

var dosya = context.Dosyalar.FirstOrDefault(x => x.Id == id);
byte[] fileData = dosya.BLOB_KOLON;

  1. 💾 Sunucuya Dosya Olarak Kaydetme (Save)

Eğer gelen dosyayı sunucunun fiziksel diskine yazmak istiyorsanız:

string dosyaYolu = Server.MapPath("~/Uploads/" + dosyaAdi);
System.IO.File.WriteAllBytes(dosyaYolu, fileData);

  1. 🌐 Tarayıcıya İndirtme (Download via Response)

Kullanıcının dosyayı kaydetmesini sağlamak için Response.BinaryWrite kullanılır. İşte standart ve güvenli şablon:

protected void Page_Load(object sender, EventArgs e)
{
    // 1. Veriyi çek (byte[] olarak)
    byte[] fileData = GetBlobFromDatabase(); 

    // 2. Dosya adı ve türünü belirle
    string fileName = "rapor.pdf";
    string mimeType = "application/pdf"; // veya "application/octet-stream"

    // 3. Response’u temizle ve başlıkları ayarla
    Response.Clear();
    Response.ContentType = mimeType;
    Response.AddHeader("Content-Disposition", $"attachment; filename=\"{fileName}\"");
    
    // 4. Binary veriyi yaz ve gönder
    Response.BinaryWrite(fileData);
    Response.Flush();
    
    // 5. (ÖNEMLİ) Response.End() yerine CompleteRequest kullan!
    HttpContext.Current.ApplicationInstance.CompleteRequest();
}

  1. 🔧 Püf Noktaları (Olması Olmazlar)

· Türkçe Karakter (ç,ğ,ü,ş,ı) Sorunu: Eğer dosya adında Türkçe karakter varsa, bozulmayı önlemek için header’ı şu şekilde düzenleyin:

string encoded = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
Response.AddHeader("Content-Disposition", $"attachment; filename=\"{encoded}\"; filename*=UTF-8''{encoded}");

· Büyük Dosyalar (200MB+): Response.BinaryWrite tüm dosyayı RAM’e yükler. Çok büyük dosyalarda Stream kullanarak chunk’lar halinde yazmak performansı artırır. · Neden CompleteRequest()? Response.End() ThreadAbortException fırlatarak uygulamayı gereksiz yere yorar. CompleteRequest() daha hafiftir.


  1. ❌ Sık Yapılan Hata: String/Base64 Karmaşası

Eğer veri size string olarak geldiyse ve Base64 değilse, muhtemelen veri bozulmuştur. Kesin çözüm: Model katmanına gidin ve string olan property’yi byte[] olarak değiştirin. BLOB verisiyle çalışırken araya Encoding.UTF8.GetString() gibi dönüşümler sokmayın; bu binary veriyi geri dönülemez şekilde bozar.


🎯 Sonuç

Oracle BLOB ile çalışmak aslında çok basittir:

  1. Veriyi byte[] olarak al.
  2. Kaydedeceksen File.WriteAllBytes kullan.
  3. İndireceksen Response.BinaryWrite ile cevap akışına yaz.

Unutmayın, Binary veri ile Metin verisi aynı değildir. Doğru türü kullandığınız sürece tüm dosya türleri (resim, doküman, video) sorunsuz çalışacaktır.