PHP ile dosya yükleme işlemi, web uygulamalarında sık kullanılan bir özellik olup, genellikle kullanıcıların dosya (resim, belge, video vb.) göndermesi gereken formlar aracılığıyla yapılır. Bu yazıda, PHP ile dosya yükleme işleminin nasıl yapılacağını adım adım açıklayacağız.

1. HTML Form Oluşturma

Dosya yükleme işlemi için öncelikle bir HTML formu oluşturulmalıdır. Bu form, dosya seçme alanı içerir ve enctype özelliği "multipart/form-data" olarak ayarlanmalıdır.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PHP Dosya Yükleme</title>
</head>
<body>
    <h2>Dosya Yükleme Formu</h2>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <label for="file">Bir dosya seçin:</label>
        <input type="file" name="file" id="file">
        <input type="submit" value="Yükle" name="submit">
    </form>
</body>
</html>

2. PHP ile Dosya Yükleme Mantığı

Yüklenen dosyaları işlemek için, formun action parametresine belirtilen upload.php dosyasında işlemleri gerçekleştireceğiz.
Bu dosyada, PHP’nin $_FILES süper global değişkenini kullanarak yüklenen dosyaya erişeceğiz. PHP'de dosya yükleme işlemini doğru ve güvenli bir şekilde yapmak için aşağıdaki adımları izleyeceğiz.

3. PHP Dosya Yükleme Adımları

Aşağıda dosyanın yüklendiği dosya olan upload.php dosyasını adım adım açıklayalım.
<?php
// Dosyanın yüklenip yüklenmediğini kontrol et
if (isset($_POST['submit'])) {
    // Yüklenen dosyaya PHP tarafından atanan geçici ad ve diğer bilgiler
    $file = $_FILES['file'];

    // Dosya bilgileri
    $fileName = $_FILES['file']['name']; // Dosya adı
    $fileTmpName = $_FILES['file']['tmp_name']; // Geçici dosya adı
    $fileSize = $_FILES['file']['size']; // Dosya boyutu
    $fileError = $_FILES['file']['error']; // Hata durumu
    $fileType = $_FILES['file']['type']; // Dosya türü

    // Yüklenmek istenen dosyanın uzantısını alma
    $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
    $allowed = ['jpg', 'jpeg', 'png', 'pdf']; // İzin verilen dosya türleri

    // Dosyanın uzantısının izin verilenler arasında olup olmadığını kontrol et
    if (in_array($fileExt, $allowed)) {
        // Hata olup olmadığını kontrol et
        if ($fileError === 0) {
            // Dosya boyutunu kontrol et (örneğin, en fazla 2MB)
            if ($fileSize < 2000000) {
                // Dosyayı yükleme klasörüne benzersiz isimle kaydetme
                $fileNewName = uniqid('', true) . "." . $fileExt;
                $fileDestination = 'uploads/' . $fileNewName;

                // Dosyayı hedef klasöre taşı
                if (move_uploaded_file($fileTmpName, $fileDestination)) {
                    echo "Dosya başarıyla yüklendi!";
                } else {
                    echo "Dosya yüklenirken bir hata oluştu.";
                }
            } else {
                echo "Dosyanız çok büyük.";
            }
        } else {
            echo "Dosya yüklenirken bir hata oluştu.";
        }
    } else {
        echo "Bu dosya türüne izin verilmiyor.";
    }
} else {
    echo "Herhangi bir dosya yüklenmedi.";
}
?>

4. PHP Dosya Yükleme Kodu Açıklaması

- $_FILES Süper Globali: Dosya yükleme işlemlerinde, HTML formundan gönderilen dosyalar $_FILES dizisi içinde saklanır. $_FILES['file'] ifadesiyle, formdaki "file" alanından gelen dosyayı temsil eder.   
name: Yüklenen dosyanın orijinal adı.   
tmp_name: Dosyanın PHP tarafından geçici olarak saklandığı dosya adı.   
size: Dosyanın boyutu (byte cinsinden).   
error: Yükleme sırasında meydana gelen herhangi bir hata (0 ise hata yoktur).
type: Dosyanın MIME türü.
 
- Dosya Uzantısı Kontrolü: pathinfo() fonksiyonu ile dosyanın uzantısı alınır ve izin verilen dosya türleriyle (jpgjpegpngpdf) karşılaştırılır.
 
- Hata ve Boyut Kontrolleri: Dosyanın boyutu ve yükleme sırasında bir hata olup olmadığı kontrol edilir.
- Dosyanın Yeniden Adlandırılması: Benzersiz dosya adları kullanmak için `uniqid()` fonksiyonu kullanılarak bir isim oluşturulur.
- Dosyanın Taşınması: move_uploaded_file() fonksiyonu, dosyayı geçici klasörden hedef klasöre taşır.

5. Yüklenen Dosyaların Saklanacağı Klasörü Oluşturma

Yüklenen dosyaları saklamak için bir uploads klasörü oluşturmalısınız. Bu klasörün sunucu üzerinde yazma izni olduğundan emin olun.
mkdir uploads
chmod 755 uploads

6. Güvenlik Önlemleri

Dosya yükleme işlemi güvenlik açıklarına yol açabilir. Aşağıdaki önlemleri almanız gerekir:
  • Dosya Türü Kısıtlamaları: Yalnızca belirli türde dosyaların yüklenmesine izin verin (örn. resimler veya belgeler).
  • Dosya Boyutu Sınırı: Büyük dosyaların yüklenmesini önlemek için maksimum boyut sınırı koyun.
  • Dosya Adı Manipülasyonu: Dosya adlarının kullanıcı tarafından değiştirilmemesi için benzersiz isimler oluşturun.
  • Sunucu Yanıtları: Herhangi bir hata durumunda kullanıcıya net hata mesajları verin, ancak sistem hakkında fazla bilgi sunmamaya dikkat edin.
Sonuç
Bu makalede, PHP ile dosya yükleme işleminin nasıl yapılacağını adım adım açıkladık. HTML formu oluşturarak dosya gönderme işlemi başlattık ve PHP ile dosya bilgilerini işleyerek yüklenen dosyayı sunucuda sakladık. Ayrıca, güvenlik önlemlerine dikkat etmenin öneminden bahsettik. Bu yöntemleri kullanarak kullanıcı dostu ve güvenli dosya yükleme işlemleri oluşturabilirsiniz.