12. Dosya İşlemleri (DLEFiles)

DLEFiles, DLE'nin dosya sistemi katmanıdır. Yerel diskte çalışır ama aynı zamanda FTP, SFTP, S3, WebDAV gibi uzak depolama alanlarına da yazabilir. Eklentiniz dosya oluşturacak/silecekse, doğrudan file_put_contents() yerine bu sınıfı kullanmak, sitenizin depolama ayarlarına otomatik uyum sağlar.

Sınıf: engine/classes/filesystem.class.php — abstract class DLEFiles, tüm public metotları static'tir. Yani nesne oluşturmazsınız.

Önce init() çağırmalısınız

public static function init( $driver = null, $local_on_remote_errors = false, $root = null )
ParametreVarsayılanAnlamı
$driver null Kullanılacak depolama sürücüsünün numarası (0 = yerel). null verilirse DLE varsayılan sürücüyü seçer.
$local_on_remote_errors false Uzak sürücü hata verirse yerel diske düş.
$root null Kök dizin. null verilirse ROOT_DIR . '/uploads/' kullanılır. Başka bir klasörde çalışacaksanız buraya verin.
!
Parametre sırası önemlidir init($driver, $local_on_remote_errors, $root) — kök dizin üçüncü parametredir. Yanlış sırayla çağırmak sessizce yanlış klasörde çalışmanıza yol açar.

DLE kaynağından gerçek çağrı örnekleri:

DLEFiles::init();                                  // varsayılan: yerel, uploads/ kökü
DLEFiles::init($disk, false);                      // belirli sürücü, uzakta hata yutma yok
DLEFiles::init(0, false, 'templates');             // yerel, kök = templates/
DLEFiles::init($disk, false, '');                  // kök = '' (sürücü kökü)
DLEFiles::init($driver, $config['local_on_fail']); // ayara göre yerele düş

Metotlar

i
Metot adları PascalCase'dir DLEFiles::Save() — save() değil. DLE'nin geri kalanı küçük harf kullanırken bu sınıf farklıdır; upload(), mkdir(), copy(), chmod() gibi metotlar yoktur.
MetotNe yapar?
init($driver, $local_on_remote_errors, $root)Sınıfı ve sürücüyü başlatır.
Read($path, $driver = null)Dosya içeriğini metin olarak döndürür.
Save($path, $contents, $driver = null)İçeriği dosyaya yazar.
FileExists($path, $driver = null)Dosya var mı?
Size($path, $driver = null)Dosya boyutu.
Checksum($path, $driver = null)Dosya checksum'ı.
Delete($path, $driver = null)Dosyayı siler.
ReadStream($path, $driver = null)Okunabilir akış (stream) döndürür.
WriteStream($path, $stream, $driver = null)Akıştan dosyaya yazar (yükleme için).
Rename($source, $destination, $driver = null)Taşır / yeniden adlandırır.
MimeType($path)Uzantıdan MIME türü tahmin eder.
ListDirectory($path, $allowed_ext = null, $driver = null, $recursive = false)Dizini listeler (dirs / files).
DeleteDirectory($path, $driver = null)Dizini içeriğiyle siler.
CreateDirectory($path, $driver = null)Dizin oluşturur.
GetBaseURL($driver = null)Dosyaların genel (public) URL tabanı.
getStorages()Tanımlı depolamaların listesi.
getDefaultStorage()Varsayılan depolamanın numarası.
FindDriver($url)Bir URL'nin hangi depolamaya ait olduğunu bulur.

Hata yakalama

Bu sınıfın metotları istisna (exception) fırlatmaz; hata durumunda DLEFiles::$error statik özelliği dolar. Bu yüzden her işlemden sonra kontrol etmelisiniz:

DLEFiles::init();

DLEFiles::Save('benim-klasorum/veri.txt', $icerik);

if (DLEFiles::$error) {
    // DLEFiles::$error hata mesajını içerir
    $hatali = true;
}

Depolama sürücüleri

NumaraSürücü
0Yerel disk (varsayılan)
1FTP
2SFTP
3Amazon S3
4S3 (Yandex Object Storage)
5S3 (özel endpoint)
6WebDAV

Kullanıcıların tanımladığı depolamalar {prefix}_storage tablosundan (veya engine/cache/system/storages.php önbelleğinden) yüklenir. getStorages() ile listesini alıp, panel formunuzda seçenek olarak sunabilirsiniz.

Örnekler

Dosya yazma ve okuma

DLEFiles::init(0, false, 'uploads');

DLEFiles::CreateDirectory('benim-eklentim');

DLEFiles::Save('benim-eklentim/rapor.txt', "İlk satır\nİkinci satır");

if (!DLEFiles::$error) {
    $icerik = DLEFiles::Read('benim-eklentim/rapor.txt');
}

Dizin listeleme

DLEFiles::init();

$liste = DLEFiles::ListDirectory('benim-eklentim', array('jpg', 'png'));

// $liste['files'] — dosyalar
// $liste['dirs']  — alt klasörler

Dosya yükleme (upload)

Yükleme işi DLEFiles değil, engine/classes/uploads/upload.class.php içindedir. Oradaki UploadFileViaForm::saveFile() metodu veriyi alıp DLEFiles ile diske yazar:

// engine/classes/uploads/upload.class.php:685-687
DLEFiles::init( $driver, $config['local_on_fail'] );
$uploaded_filename = $this->file->saveFile($this->upload_path . FOLDER_PREFIX, $filename, $auto_prefix, $force_prefix);

// … ve içeride (:306-341):
DLEFiles::WriteStream( $path . $filename, $stream );
★
Genel dosya yüklemesi için DLE'nin AJAX yükleyicisini kullanın DLE'nin engine/ajax/upload.php modülü, tüm güvenlik denetimleri (izin verilen uzantılar, boyut, antivirüs taraması, görsel işleme) hazır olarak gelir. Kendi yükleyicinizi sıfırdan yazmak yerine bu modülü subaction parametreleriyle kullanmayı düşünün.

Neden doğrudan file_put_contents kullanmamalıyım?

file_put_contents()DLEFiles
Yerel disk Çalışır Çalışır
Uzak depolama (S3/FTP…) Başarısız Çalışır
Kullanıcının depolama ayarına saygı Yok Var
Genel URL üretimi Elle GetBaseURL()
!
Ama her iş için de değil engine/cache/… gibi sunucuya özel yerlere yazacaksanız (önbellek, log) DLEFiles uygun değildir; çünkü bu yollar uzak depolamaya taşınamaz. Onlar için normal PHP dosya fonksiyonlarını kullanın.

Dosya işlemleri kontrol listesi

  • Kullanmadan önce DLEFiles::init() çağrıldı.
  • $root parametresi doğru sırada (üçüncü) verildi.
  • Metot adları doğru yazıldı (PascalCase).
  • Her işlemden sonra DLEFiles::$error kontrol edildi.
  • Kullanıcıdan gelen dosya adları süzüldü (dizin atlama ../ engellendi).
  • Önbellek/log gibi sunucuya özel dosyalar için normal PHP fonksiyonları kullanıldı.

Sırada: Zamanlanmış Görevler.