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?
- 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.
-
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']));