🗄️ 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:
- 📥 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;
- 💾 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);
- 🌐 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();
}
- 🔧 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.
- ❌ 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:
- Veriyi byte[] olarak al.
- Kaydedeceksen File.WriteAllBytes kullan.
- İ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.