Bir proje geliştirirken dosya yükleme özelliği neredeyse her zaman karşımıza çıkar. Özellikle video yükleme sayfalarında kullanıcıların farklı cihazlardan, farklı platformlardan çekilmiş videolar yüklemesi beklenen bir durumdur. Fakat CodeIgniter kullanan birçok geliştirici gibi ben de ilginç bir hata ile karşılaştım:
“Seçtiğiniz dosya türünün yüklenmesine izin verilmiyor.”
Sorun, MP4 dosyası yüklerken ortaya çıkıyordu. İlk iki videoda sorun yoktu, ancak üçüncü videoda framework dosyayı reddediyordu. Uzantı aynıydı, dosya adı uygundu, boyut sınırı aşılmamıştı… Peki sorun neydi?
Bu yazıda hatanın nedenini ve kalıcı çözümü detaylarıyla anlatıyorum.
Sorun Nerede? — Uzantı Değil, MIME Tipi
Çoğu geliştirici gibi benim ilk tahminim dosya uzantısı veya isimlendirme sorunu oldu. Ancak dosyayı yeniden adlandırmak hiçbir işe yaramadı. Yüklenmeyen video, WhatsApp üzerinden gelen bir .mp4 dosyasıydı.
Asıl problem şu:
👉 CodeIgniter dosyayı uzantıya göre değil, gerçek MIME tipine göre kontrol eder.
👉 MP4 uzantısı olsa bile MIME tipi beklenen değerle eşleşmiyorsa yüklemeye izin vermez.
CodeIgniter’ın varsayılan mimes.php dosyasında mp4 için sadece tek bir MIME tanımı bulunuyor:
'mp4' => 'video/mp4',
Bu, günümüzde çok yetersiz.
Çünkü özellikle telefon kameraları ve WhatsApp videoları MP4 dosyalarını şu MIME tipleriyle gönderebiliyor:
video/mp4video/quicktimeapplication/octet-streamvideo/3gppvideo/3gpp2video/mp4; codecs="hvc1"video/x-matroska
CodeIgniter bu MIME tiplerini bilmediği için MP4 uzantılı videonun gerçek formatını tanıyamıyor ve doğal olarak yüklemeyi engelliyor.
Çözüm: MIME Tiplerini Genişletmek
Sorunu çözmek için application/config/mimes.php dosyasındaki mp4 tanımını genişletmek gerekiyor.
Varsayılan hâli:
'mp4' => 'video/mp4',
Bunu şu şekilde güncellediğinizde tüm MP4 varyasyonları sorunsuz kabul edilir:
'mp4' => array(
'video/mp4',
'video/quicktime',
'video/3gpp',
'video/3gpp2',
'application/octet-stream',
'video/x-matroska'
),
Aynı şekilde bazı cihazların farklı MIME tipi kullandığı m4a ses dosyalarını da genişletebilirsiniz:
'm4a' => array(
'audio/x-m4a',
'audio/mp4',
'application/octet-stream'
),
Bu değişiklikten sonra WhatsApp videoları dahil tüm MP4 videolar sorunsuz yüklenmeye başlar.
Gerçek MIME Tipini Öğrenmek İsterseniz
Bazen kullanıcıdan gelen dosyanın MIME tipini merak edebilirsiniz. Bunun için yükleme aşamasında şu satırı geçici olarak ekleyebilirsiniz:
var_dump($_FILES['video']['type']);
Kod çalıştığında şöyle bir çıktı görürseniz şaşırmayın:
application/octet-stream
ya da:
video/quicktime
Bu tipler zaten yukarıdaki çözümün neden gerekli olduğunun kanıtı.
Sonuç
CodeIgniter’ın varsayılan MIME tanımları eski kaldığı için modern cihazlar tarafından oluşturulan medya dosyalarını her zaman doğru şekilde tanımlayamıyor. Sorun uzantıyla ilgili değil, dosyanın gerçek içerik türüyle ilgili.
Bu nedenle özellikle video yükleme özelliği geliştiriyorsanız:
✔ mimes.php dosyasındaki MIME listelerini genişletin
✔ Değişik platformlardan gelen dosyaların farklı MIME değerlerine sahip olabileceğini unutmayın
✔ Test sırasında gerçek MIME değerini görüntüleyin
Böylece “Seçtiğiniz dosya türünün yüklenmesine izin verilmiyor” hatasını bir daha görmezsiniz.