Python ve Flask ile Web Tabanlı Gelişmiş Dosya Yöneticisi Yapımı

Kendi dosyalarınızı yönetebileceğiniz, yükleyip önizleyebileceğiniz bir sistem kurmak istediğinizde aklınıza gelen ilk şey karmaşık bulut depolama servisleri olabilir. Ancak Python ve Flask kullanarak, kendi sunucunuzda çalışan, hafif, güvenli ve oldukça yetenekli bir Web Tabanlı Dosya Yöneticisi oluşturmak sandığınızdan çok daha kolay.

Bu yazıda, geliştirmiş olduğum kapsamlı dosya yöneticisi projesini inceleyeceğiz. Basit bir “dosya yükle” butonundan çok daha fazlasını sunan; tür tespiti yapabilen, PDF ve görselleri anında önizleyebilen ve depolama istatistiklerini takip eden bir uygulamayı nasıl inşa edebileceğinizi göreceksiniz.

🚀 Uygulamanın Temel Özellikleri

Proje, kullanıcı deneyimini ön plana çıkaran şu özelliklerle donatılmıştır:

  • Çoklu Dosya Yükleme: Tek tek uğraşmak yerine, aynı anda birden fazla dosyayı sürükleyip bırakarak veya seçerek yükleme imkanı.
  • Akıllı Dosya Türü Tespiti: Yüklenen dosyanın uzantısına göre otomatik olarak uygun simgeler (🖼, 📄, 📝, 📦 vb.) atama.
  • Satır İçi (Inline) Önizleme:
    • Görseller: Tarayıcıda doğrudan görüntüleme.
    • PDF’ler: Gömülü PDF görüntüleyici ile hızlıca göz atma.
    • Metin ve Kod Dosyaları: İçeriğin ilk 20KB’lık kısmını anında okuma.
  • Depolama Paneli: Toplam dosya sayısı, toplam kullanılan alan ve kategori bazlı (Görsel, PDF, Diğer) dosya dağılımını gösteren dinamik istatistik kartları.
  • Güvenli Dosya Yönetimi: Dosya adlarını sanitize ederek güvenlik açıklarını önleme ve aynı isimli dosyalar için otomatik zaman damgalı isimlendirme.

🛠️ Kodun Anatomisi

Projenin teknik detayları ve geliştirme ortamı şu şekildedir:

Proje Künyesi

  • Yazar: Ahmet Aksoy
  • Tarih: 17 Nisan 2026
  • Ortam: Python 3.12 / Ubuntu 24.04
  • Kütüphaneler: Flask, Werkzeug

Uygulama üç ana katmandan oluşur:

  1. filemanager_app.py: Uygulamanın giriş noktasıdır. Flask yapılandırmasını yapar ve rotaları başlatır.
  2. filemanager_helpers.py: Uygulamanın “beyni” burasıdır. Dosya okuma, yazma, silme, boyut hesaplama ve MIME türü tespiti gibi tüm mantıksal işlemler burada yürütülür.
  3. filemanager_templates/: HTML5 ve Jinja2 kullanılarak hazırlanmış, modern ve responsive (duyarlı) kullanıcı arayüzü şablonları.

🔍 Kritik Teknik Detaylar

1. Güvenlik ve secure_filename

Web üzerinden dosya kabul ederken en büyük risk, kullanıcının ../../etc/passwd gibi tehlikeli dosya yolları göndererek sistem dosyalarına erişmeye çalışmasıdır. Bunu önlemek için projenin merkezinde werkzeug.utils.secure_filename fonksiyonu yer alır:

from werkzeug.utils import secure_filename

# Kullanıcıdan gelen dosya adını temizler ve güvenli hale getirir
filename = secure_filename(f.filename)

2. Çakışan Dosya İsimlerini Yönetmek

Aynı isimli iki dosya yüklendiğinde, varsayılan olarak ikinci dosya birincisinin üzerine yazılır. Bunu önlemek için projenizle birlikte gelen şu mantığı uyguladım: eğer dosya zaten varsa, ismin sonuna bir zaman damgası eklenir.

if os.path.exists(dest):
    ts = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f"{base}_{ts}{ext}"

3. Dinamik Dosya Önizleme

Dosya türüne göre farklı önizleme yöntemleri kullanmak, kullanıcı deneyimini ciddi oranda artırır. Uygulama, mimetypes modülü ve uzantı kontrolü ile dosyanın ne olduğunu anlar ve preview.html şablonuna uygun file_type bilgisini gönderir. Metin dosyaları için ise bellek tüketimini önlemek amacıyla sadece ilk 20KB okunur.


📈 Depolama İstatistikleri Nasıl Hesaplanır?

Ana sayfadaki istatistik kartları, uploads klasöründeki tüm dosyaları tarayarak gerçek zamanlı olarak hesaplanır. Python’un os.stat() fonksiyonu ile ham bayt cinsinden alınan boyutlar, human_size() yardımcı fonksiyonu ile okunabilir formatlara (KB, MB, GB) dönüştürülür.

def human_size(nbytes):
    for unit in ['B', 'KB', 'MB', 'GB']:
        if nbytes < 1024:
            return f"{nbytes:.1f} {unit}"
        nbytes /= 1024
    return f"{nbytes:.1f} TB"

🏁 Sonuç

Bu proje, Python’un dosya sistemiyle etkileşim gücünü ve Flask’ın esnekliğini bir araya getirerek, kurumsal seviyede bir dosya yöneticisinin temel taşlarını oluşturuyor. Projeyi kendi ihtiyaçlarınıza göre geliştirerek; kullanıcı yetkilendirme (login), dosya klasörleme veya bulut depolama (AWS S3 gibi) entegrasyonları ekleyebilirsiniz.

Ahmet Aksoy

Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.


#python #flask #webdevelopment #filemanager #coding #pythonprojects #backend

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir