CodeBlanks Logo Icon CodeBlanks

Özet - Dosya yükleme

PHP kursu · Orta seviye · Ders 81/115

$_FILES, move_uploaded_file ve doğrulamayla profil resmi yükleme yazarsın.

Özet - Dosya yükleme

Bu grupta dosya yüklemeyle ilgili beş temel kavramı öğrendin:

  • $_FILES süper globali ile dosya üst verisini okuma
  • move_uploaded_file() ile geçici dosyayı kalıcı konuma taşıma
  • MIME türü ile in_array() doğrulaması
  • size alanı ile boyut sınırı kontrolü
  • error kodları ile anlamlı hata mesajları

Bunları bir profil resmi yükleme fonksiyonunda birleştireceksin: önce hata kodunu, sonra türü, sonra boyutu kontrol edip dosyayı taşıyacaksın.

Uygulama Profil resmi yükleme

Bir uploadProfilePicture(array $file, string $dir): string fonksiyonu yaz. Önce $file['error'] !== UPLOAD_ERR_OK ise return 'Hata: kod ' . $file['error']. Sonra $allowed = ['image/png', 'image/jpeg'] tanımla; !in_array($file['type'], $allowed, true) ise return 'Reddedildi: ' . $file['type']. Sonra $file['size'] > 2097152 ise return 'Çok büyük: ' . $file['size']. En son $destination = $dir . '/' . basename($file['name']) ile yolu yapıp move_uploaded_file($file['tmp_name'], $destination) çağır ve return 'Tamam: ' . $destination döndür. Test için $_FILES['avatar'] tanımla (name: 'profil.png', type: 'image/png', tmp_name: '/tmp/phpAbCd.tmp', error: 0, size: 102400) ve echo uploadProfilePicture($_FILES['avatar'], 'uploads') . "\n" yaz.

Örnek çözümü göster
' + destination döndür.
Örnek çözüm:
<?php
// Profil resmi yükleme
function uploadProfilePicture(array $file, string $dir): string {
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return "Hata: kod " . $file['error'];
    }
    $allowed = ['image/png', 'image/jpeg'];
    if (!in_array($file['type'], $allowed, true)) {
        return "Reddedildi: " . $file['type'];
    }
    if ($file['size'] > 2097152) {
        return "Çok büyük: " . $file['size'];
    }
    $destination = $dir . '/' . basename($file['name']);
    move_uploaded_file($file['tmp_name'], $destination);
    return "Tamam: " . $destination;
}

$_FILES['avatar'] = [
    'name' => 'profil.png',
    'type' => 'image/png',
    'tmp_name' => '/tmp/phpAbCd.tmp',
    'error' => 0,
    'size' => 102400
];

echo uploadProfilePicture($_FILES['avatar'], 'uploads') . "\n";

Dosya yükleme ipuçları

Dosya yüklemede aklında tutman gereken ipuçları:

  • Formda her zaman enctype="multipart/form-data" kullan.
  • Taşımadan önce hata kodunu, MIME türünü ve boyutu kontrol et.
  • Hedef yolu oluştururken basename() ile yol saldırılarını engelle.
  • Kullanıcının gönderdiği type alanına güvenme; gerekiyorsa finfo kullan.
  • Yüklenen dosyaları web kök dizini dışında ya da özel bir klasörde sakla.

Bir sonraki grupta oturumlar (sessions) ile kullanıcı takibine bakacağız.

Kendini test et

  1. Tüm kavramları eşleştir

    $_FILES
    Dosya üst verisi
    move_uploaded_file
    Geçici dosyayı taşır
    in_array
    Türü doğrular
    $_FILES['size']
    Boyutu verir
    UPLOAD_ERR_OK
    Hata yok
  2. move_uploaded_file'dan önce her zaman ne yapmalısın?

    • Hata kodunu, türü ve boyutu doğrula
    • Dosyayı önce echo ile yazdır
    • rename çağır
    • tmp_name'i sil
    Cevabı göster

    Hata kodunu, türü ve boyutu doğrula — Doğru. Taşımadan önce doğrulama şarttır.

Orta seviye bölümündeki tüm dersler