PHP 8 ile çoklu dosya yükleme işlemi, kullanıcıların birden fazla dosyayı aynı anda seçip sunucuya yüklemesine olanak tanır. Bunun için formda multiple
özelliği kullanılır ve dosyalar PHP'de $_FILES
süper global dizisiyle işlenir. Çoklu dosya yükleme, tek dosya yüklemeye benzer, ancak tüm dosyalar bir dizi olarak gönderilir ve işlenir.
1. HTML Formu ile Çoklu Dosya Yükleme
Öncelikle, kullanıcıya aynı anda birden fazla dosya seçme imkânı tanıyan bir HTML formu oluşturalım.
<form action="multi_upload.php" method="post" enctype="multipart/form-data">
<label for="file">Dosyaları seçin:</label>
<input type="file" name="dosyalar[]" id="file" multiple>
<br>
<br>
<input type="submit" value="Dosyaları Yükle">
</form>
Önemli Noktalar:
-
name="dosyalar[]"
:[]
işareti, dosyaların bir dizi olarak PHP'ye gönderileceğini belirtir. -
multiple
: Kullanıcının birden fazla dosya seçmesine olanak tanır.
2. PHP ile Çoklu Dosya Yükleme (multi_upload.php)
Kullanıcı formu gönderdiğinde, tüm dosyaları sunucuya yükleyen bir PHP betiği yazalım.
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$dosyalar = $_FILES['dosyalar'];
// Dosya yükleme dizini
$hedef_dizin = 'uploads/';
// Desteklenen dosya türleri
$gecerli_mime_turleri = ['image/jpeg', 'image/png', 'application/pdf'];
// Maksimum dosya boyutu (örneğin 2MB)
$max_boyut = 2 * 1024 * 1024;
// Her bir dosyayı sırayla kontrol edelim
for ($i = 0; $i < count($dosyalar['name']); $i++) {
$dosya_adi = basename($dosyalar['name'][$i]);
$gecici_dosya_yolu = $dosyalar['tmp_name'][$i];
$dosya_boyutu = $dosyalar['size'][$i];
$dosya_hata = $dosyalar['error'][$i];
// Dosyanın yükleneceği hedef yol
$hedef_yol = $hedef_dizin . $dosya_adi;
// Dosya yükleme sırasında hata olup olmadığını kontrol et
if ($dosya_hata === UPLOAD_ERR_OK) {
// Dosyanın MIME türünü kontrol et
$dosya_mime_turu = mime_content_type($gecici_dosya_yolu);
// Dosya türü ve boyutunu kontrol et
if (in_array($dosya_mime_turu, $gecerli_mime_turleri) && $dosya_boyutu <= $max_boyut) {
// Dosya sunucuya taşınsın
if (move_uploaded_file($gecici_dosya_yolu, $hedef_yol)) {
echo "Dosya başarıyla yüklendi: " . $dosya_adi . "<br>";
} else {
echo "Dosya yüklenirken hata oluştu: " . $dosya_adi . "<br>";
}
} else {
echo "Geçersiz dosya türü veya boyutu: " . $dosya_adi . "<br>";
}
} else {
echo "Dosya yükleme hatası: " . $dosya_adi . "<br>";
}
}
}
?>
Açıklama:
-
$_FILES['dosyalar']
Dizisi: Çoklu dosya yüklemelerde,$_FILES
dizisi aşağıdaki gibi düzenlenir:-
$_FILES['dosyalar']['name']
: Tüm dosya isimlerinin bulunduğu bir dizi. -
$_FILES['dosyalar']['tmp_name']
: Geçici olarak kaydedilen dosya yollarının bulunduğu bir dizi. -
$_FILES['dosyalar']['size']
: Her dosyanın boyutunun bulunduğu bir dizi. -
$_FILES['dosyalar']['error']
: Her dosya için hata kodlarını içeren bir dizi.
-
-
Döngü Kullanımı: Tüm dosyaları tek tek işlemek için bir
for
döngüsü kullanıyoruz.- Her dosyanın adı, boyutu, hata durumu ve geçici yolu aynı dizide farklı indekslerde yer alır.
-
move_uploaded_file()
: Geçici dosya dizinindeki dosyaları belirlediğimiz hedef dizine (uploads/
) taşır. -
Dosya Türü ve Boyutu Kontrolü: Yüklenen her dosyanın türünü ve boyutunu kontrol ederiz:
-
mime_content_type()
: Dosyanın MIME türünü doğrular. - Dosya boyutunu
$_FILES['dosyalar']['size']
ile kontrol ederiz.
-
3. Hedef Dizin Oluşturma
PHP dosyaları yükleyebilmek için bir dizine ihtiyaç duyar. Eğer uploads
dizini yoksa veya sunucunun bu dizine yazma izni yoksa, dosya yüklenemez. Bu yüzden, sunucu üzerinde bu dizini oluşturmalısınız ve uygun yazma izni vermelisiniz.
Linux sunucularda şu komutu kullanarak yazma izni verebilirsiniz:
chmod 777 uploads
4. Hata Kodları
PHP, dosya yükleme sırasında her bir dosya için bir hata kodu döndürür. Bu hata kodlarını kontrol ederek, yükleme işleminin başarılı olup olmadığını anlayabilirsiniz. İşte yaygın hata kodları:
-
UPLOAD_ERR_OK
(0): Dosya başarıyla yüklendi. -
UPLOAD_ERR_INI_SIZE
(1): PHP yapılandırmasında belirtilenupload_max_filesize
değerini aştı. -
UPLOAD_ERR_FORM_SIZE
(2): HTML formunda belirtilenMAX_FILE_SIZE
değerini aştı. -
UPLOAD_ERR_PARTIAL
(3): Dosya sadece kısmen yüklendi. -
UPLOAD_ERR_NO_FILE
(4): Hiçbir dosya yüklenmedi.
5. Dosyaların Aynı Adla Yüklenmesini Engelleme
Eğer kullanıcı aynı ada sahip dosyalar yüklüyorsa, dosyaların üzerine yazılmasını engellemek için dosya isimlerini benzersiz hale getirebilirsiniz.
Örnek:
$benzersiz_adi = uniqid() . '-' . $dosya_adi;
$hedef_yol = $hedef_dizin . $benzersiz_adi;
Bu şekilde her dosya için benzersiz bir ad oluşturabilir ve çakışmaları önleyebilirsiniz.
Sonuç:
PHP 8 ile çoklu dosya yükleme işlemi, kullanıcıların birden fazla dosya seçip sunucuya yüklemelerini sağlar. Dosyaların boyutunu, türünü ve yükleme hatalarını kontrol ederek güvenli bir şekilde bu işlemi gerçekleştirebilirsiniz.