PHP
Dosya yükleme entegrasyonu
İ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
-
$_FILES anahtarlarını eşleştir
- name
- Orijinal dosya adı
- tmp_name
- Geçici yol
- size
- Dosya boyutu
- error
- Hata kodu
-
Yüklenen dosyanın geçici yolu hangi anahtarda gelir?
Cevabı göster
tmp_name — Doğru. tmp_name dosyanın geçici yolunu tutar; move_uploaded_file bu yoldan taşır.
-
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']));
Sıradaki ders: Proje sonu - İletişim formu