Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] path.extname ile Uzanti Alma
Herkese merhaba, bugun dosya uzantilariyla calismak icin kullandigimiz path.extname fonksiyonunu detayli inceleyecegiz. Dosya uzantisi almak basit bir islem gibi gorunse de, dogru yapilmadiginda guvenlik aciklari olusabilir veya dosya turleri yanlis tespite edilebilir. Ben bir keresinde uzanti kontrolunu string split ile yapan bir kod gordum, adam dosya adindaki son noktadan sonrasini aliyordu ama "foto.backup.jpg" gibi dosyalarda yanlis sonuc veriyordu.
Temel Kullanim
path.extname bir dosya yolundan uzantiyi dondurur. Donen deger noktayi da icerir, yani ".jpg", ".txt" gibi. Eger dosyanin uzantisi yoksa bos string doner. Dikkat edilmesi gereken bir nokta: dosya adi noktayla basliyorsa (mesela .gitignore) bu bir uzanti olarak sayilmaz ve bos string doner. Bu Linux'taki gizli dosya geleneginden gelir.
JavaScript:
const path = require('path');
console.log('=== Temel Uzanti Alma ===');
// Normal dosyalar
console.log(path.extname('foto.jpg')); // .jpg
console.log(path.extname('belge.pdf')); // .pdf
console.log(path.extname('script.min.js')); // .js (son uzanti)
console.log(path.extname('arsiv.tar.gz')); // .gz (son uzanti)
console.log(path.extname('data.backup.sql')); // .sql
// Uzantisiz dosyalar
console.log('\n=== Uzantisiz Dosyalar ===');
console.log(path.extname('Makefile')); // '' (bos)
console.log(path.extname('LICENSE')); // '' (bos)
console.log(path.extname('Dockerfile')); // '' (bos)
// Noktayla baslayan dosyalar (gizli dosyalar)
console.log('\n=== Gizli Dosyalar ===');
console.log(path.extname('.gitignore')); // '' (bos!)
console.log(path.extname('.env')); // '' (bos!)
console.log(path.extname('.eslintrc.json')); // .json
console.log(path.extname('.babel.config.js')); // .js
// Yol iceren dosyalar
console.log('\n=== Yollu Dosyalar ===');
console.log(path.extname('/home/user/app.js')); // .js
console.log(path.extname('C:\\Users\\docs\\rapor.xlsx')); // .xlsx
console.log(path.extname('./src/index.ts')); // .ts
// Ozel durumlar
console.log('\n=== Ozel Durumlar ===');
console.log(path.extname('dosya.')); // .
console.log(path.extname('..')); // '' (bos)
console.log(path.extname('.')); // '' (bos)
console.log(path.extname('')); // '' (bos)
Dosya Turu Dogrulama
Uzanti kontrolu en cok dosya upload islemlerinde kullanilir. Kullanicinin yukledigi dosyanin izin verilen turde olup olmadigini kontrol etmek icin path.extname ile uzantiyi alip beyaz listeyle karsilastirabilirsiniz. Ama sunu unutmayin: uzanti kontrolu tek basina guvenlik icin yeterli degildir. Bir kullanici zarali bir dosyanin uzantisini .jpg yapabilir. Bu yuzden uzanti kontrolunun yaninda dosya icerigini de (magic bytes) kontrol etmenizi siddetle tavsiye ederim.
JavaScript:
const path = require('path');
const fs = require('fs');
// Dosya turu dogrulayici sinif
class DosyaTuruDogrulayici {
constructor() {
this.izinVerilenTurler = {
resim: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp'],
belge: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.pptx', '.txt', '.csv'],
video: ['.mp4', '.avi', '.mkv', '.mov', '.webm'],
ses: ['.mp3', '.wav', '.ogg', '.flac', '.aac'],
kod: ['.js', '.ts', '.py', '.java', '.cpp', '.html', '.css', '.json']
};
// Tehlikeli uzantilar
this.yasakliUzantilar = [
'.exe', '.bat', '.cmd', '.sh', '.ps1', '.vbs',
'.dll', '.sys', '.com', '.msi', '.scr', '.pif'
];
}
uzantiAl(dosyaAdi) {
return path.extname(dosyaAdi).toLowerCase();
}
turKontrol(dosyaAdi, izinVerilenKategori) {
const uzanti = this.uzantiAl(dosyaAdi);
if (!uzanti) {
return { gecerli: false, sebep: 'Dosya uzantisi bulunamadi' };
}
if (this.yasakliUzantilar.includes(uzanti)) {
return { gecerli: false, sebep: `Yasakli uzanti: ${uzanti}` };
}
const izinVerilenler = this.izinVerilenTurler[izinVerilenKategori];
if (!izinVerilenler) {
return { gecerli: false, sebep: `Bilinmeyen kategori: ${izinVerilenKategori}` };
}
if (!izinVerilenler.includes(uzanti)) {
return {
gecerli: false,
sebep: `${uzanti} uzantisi "${izinVerilenKategori}" kategorisinde izin verilmiyor. Izin verilen: ${izinVerilenler.join(', ')}`
};
}
return { gecerli: true, uzanti, kategori: izinVerilenKategori };
}
cokluTurKontrol(dosyaAdi, kategoriler) {
const uzanti = this.uzantiAl(dosyaAdi);
for (const kategori of kategoriler) {
const sonuc = this.turKontrol(dosyaAdi, kategori);
if (sonuc.gecerli) return sonuc;
}
return { gecerli: false, sebep: `${uzanti} izin verilen hicbir kategoride degil` };
}
}
// Kullanim
const dogrulayici = new DosyaTuruDogrulayici();
const testDosyalar = [
'profil.jpg', 'rapor.pdf', 'virus.exe',
'script.js', 'video.mp4', 'gizli.bat',
'arsiv.tar.gz', '.env', 'README'
];
console.log('=== Dosya Turu Dogrulama ===\n');
testDosyalar.forEach(dosya => {
const sonuc = dogrulayici.cokluTurKontrol(dosya, ['resim', 'belge']);
const durum = sonuc.gecerli ? 'GECERLI' : 'REDDEDILDI';
console.log(`${dosya.padEnd(20)} -> ${durum}`);
if (!sonuc.gecerli) console.log(`${' '.repeat(23)}Sebep: ${sonuc.sebep}`);
});
MIME Type Eslestirme
Uzantidan MIME type belirlemek web sunucusu yazarken sik ihtiyac duyulan bir islem. Express.js bunu otomatik yapar ama kendi sunucunuzu yazdiginizda veya statik dosya sundugunuzda bu eslestirmeyi kendiniz yapmaniz gerekir. Ben genelde kucuk projeler icin kendi haritami olusturuyorum, buyuk projeler icin mime-types kutuphanesini kullaniyorum.
Aklimda kalani da soyleyeyim: extname fonksiyonu her zaman son uzantiyi dondurur. Yani "dosya.tar.gz" icin ".gz" doner, ".tar.gz" degil. Cift uzantili dosyalarla calisiyorsaniz bu durumu goz onunde bulundurun ve gerekirse kendi parse fonksiyonunuzu yazin. Hadi, sonraki konuya gecelim!
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 3
- Görüntüleme
- 475
- Cevaplar
- 13
- Görüntüleme
- 1K
- Cevaplar
- 0
- Görüntüleme
- 3K
- Cevaplar
- 4
- Görüntüleme
- 1K
