CodeBlanks Logo Icon CodeBlanks

Dosya yükleme entegrasyonu

PHP kursu · Orta seviye · Ders 97/115

İletişim formuna ek dosya (ör. ekran görüntüsü) yükleme eklersin.

Dosya yükleme entegrasyonu

İletişim formuna ek dosya (ör. ekran görüntüsü) yüklemek isteyebilirsin. Önceki gruplarda öğrendiğin gibi, yüklenen dosya $_FILES süper globalinde gelir; her dosya name, tmp_name, error, size gibi alanlara sahiptir.

handleUpload(array $file): string fonksiyonu yazarsın. Önce $file['error'] UPLOAD_ERR_OK'ye eşit mi diye bakarsın; değilse "skip" döndürürsün. Sonra $file['size'] ile boyut sınırını (ör. 2 MB) denetlersin. Her şey yolundaysa move_uploaded_file ile dosyayı kalıcı yere taşarsın.

move_uploaded_file ile taşıma

Yüklenen dosya önce geçici bir yola konur (tmp_name). Bu dosya betik bitince silinir; kalıcı olması için move_uploaded_file($file['tmp_name'], $dest) çağrısıyla hedef yere taşırsın. $dest üretirken basename($file['name']) kullanmak güvenliği korur; böylece kullanıcı kök dizin adı gönderemez.

Bu fonksiyon yalnızca gerçek HTTP yüklemelerinde çalışır; CLI testinde false döner ama uyarı vermez. Bu yüzden test çıktısı deterministik kalır.

Uygulama handleUpload fonksiyonunu yaz

Bir handleUpload(array $file): string fonksiyonu yaz. $file['error'] !== UPLOAD_ERR_OK ise return "skip";. $file['size'] > 2 * 1024 * 1024 ise return "skip";. Sonra $dest = __DIR__ . "/uploads/" . basename($file['name']); ile yolu yapıp move_uploaded_file($file['tmp_name'], $dest); çağır ve return "ok"; döndür. Test için $_FILES dizisine üç dosya ekle: geçerli (error=UPLOAD_ERR_OK, size=1024), çok büyük (size=3*1024*1024) ve hatalı (error=UPLOAD_ERR_NO_FILE). echo handleUpload($_FILES['ok']) . "/" . handleUpload($_FILES['big']) . "/" . handleUpload($_FILES['err']); yaz.

Örnek çözümü göster
string { if ($file['error'] !== UPLOAD_ERR_OK) { return "skip"; } if ($file['size'] > 2 * 1024 * 1024) { return "skip"; } $dest = __DIR__ . "/uploads/" . basename($file['name']); move_uploaded_file($file['tmp_name'], $dest); return "ok"; } yaz. $_FILES dizisine 'ok', 'big', 'err' anahtarlarıyla üç dosya ver; echo handleUpload($_FILES['ok']) . "/" . handleUpload($_FILES['big']) . "/" . handleUpload($_FILES['err']); yaz.
Örnek çözüm:
<?php
// Dosya yükleme entegrasyonu ekle
class ContactMessage {
    public string $name = "";
    public string $email = "";
    public string $message = "";
}

function renderForm(): string {
    return '<form method="post" action="/iletisim.php">'
        . '<label>Ad: <input type="text" name="name"></label>'
        . '<label>E-posta: <input type="email" name="email"></label>'
        . '<label>Mesaj: <textarea name="message"></textarea></label>'
        . '<input type="submit" value="Gönder">'
        . '</form>';
}

function validateMessage(ContactMessage $m): array {
    $errors = [];
    if (empty($m->name)) {
        $errors[] = "Ad boş";
    }
    if (empty($m->email) || filter_var($m->email, FILTER_VALIDATE_EMAIL) === false) {
        $errors[] = "E-posta geçersiz";
    }
    return $errors;
}

function handleUpload(array $file): string {
    if ($file['error'] !== UPLOAD_ERR_OK) {
        return "skip";
    }
    if ($file['size'] > 2 * 1024 * 1024) {
        return "skip";
    }
    $dest = __DIR__ . "/uploads/" . basename($file['name']);
    move_uploaded_file($file['tmp_name'], $dest);
    return "ok";
}

$_FILES = [
    'ok' => ['name' => 'gorsel.png', 'type' => 'image/png', 'tmp_name' => '/tmp/gecici.tmp', 'error' => UPLOAD_ERR_OK, 'size' => 1024],
    'big' => ['name' => 'büyük.zip', 'type' => 'application/zip', 'tmp_name' => '/tmp/big.tmp', 'error' => UPLOAD_ERR_OK, 'size' => 3 * 1024 * 1024],
    'err' => ['name' => '', 'type' => '', 'tmp_name' => '', 'error' => UPLOAD_ERR_NO_FILE, 'size' => 0],
];
echo handleUpload($_FILES['ok']) . "/" . handleUpload($_FILES['big']) . "/" . handleUpload($_FILES['err']);

Kendini test et

  1. $_FILES anahtarlarını eşleştir

    name
    Orijinal dosya adı
    tmp_name
    Geçici yol
    size
    Dosya boyutu
    error
    Hata kodu
  2. Yüklenen dosyanın geçici yolu hangi anahtarda gelir?

    • tmp_name
    • name
    • size
    • error
    Cevabı göster

    tmp_name — Doğru. tmp_name dosyanın geçici yolunu tutar; move_uploaded_file bu yoldan taşır.

  3. move_uploaded_file çağrısını tamamla

    move_uploaded_file($file['____'], __DIR__ . "/uploads/" . basename($file['name']));
    Cevabı göster
    move_uploaded_file($file['tmp_name'], __DIR__ . "/uploads/" . basename($file['name']));

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