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 )
| Parametre | Varsayılan | Anlamı |
|---|---|---|
$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. |
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
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.
| Metot | Ne 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
| Numara | Sürücü |
|---|---|
0 | Yerel disk (varsayılan) |
1 | FTP |
2 | SFTP |
3 | Amazon S3 |
4 | S3 (Yandex Object Storage) |
5 | S3 (özel endpoint) |
6 | WebDAV |
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 );
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() |
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ı. $rootparametresi doğru sırada (üçüncü) verildi.- Metot adları doğru yazıldı (PascalCase).
- Her işlemden sonra
DLEFiles::$errorkontrol 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.