PHP 8 ile çoklu dosya yükleme işlemi, bir form aracılığıyla birden fazla dosyanın aynı anda yüklenmesine olanak tanır. Bu özellik, kullanıcıların toplu olarak dosya yüklemelerini sağlar. PHP’nin dosya yükleme özelliklerini kullanarak çoklu dosya yükleme işlemi kolaylıkla gerçekleştirilebilir.
1. HTML Formu ile Çoklu Dosya Yükleme
Öncelikle, birden fazla dosya seçimine izin veren bir HTML formu oluşturmalıyız. Formda multiple
özelliğini kullanarak kullanıcıların aynı anda birden fazla dosya seçmesine olanak tanırız.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Çoklu Dosya Yükleme</title>
</head>
<body>
<h2>Çoklu Dosya Yükleme Formu</h2>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<label for="files">Dosyaları Seçin:</label>
<input type="file" name="files[]" id="files" multiple>
<br>
<br>
<input type="submit" value="Dosyaları Yükle">
</form>
</body>
</html>
2. PHP ile Çoklu Dosya Yükleme İşlemi
Formdan gönderilen dosyalar, PHP’de $_FILES
süper global değişkeni ile alınır. Çoklu dosya yüklemesi sırasında, dosyalar bir dizi olarak gelir. Her bir dosyanın name
, type
, tmp_name
, error
ve size
değerleri diziler halinde olur. Aşağıda bu sürecin nasıl işlediği gösterilmiştir.
2.1. PHP Dosya Yükleme Mantığı
PHP'de çoklu dosya yüklemek için döngü kullanılarak her bir dosya işlenir. Her bir dosya için, yükleme dizinine taşımak için move_uploaded_file()
fonksiyonu kullanılır.
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$uploadDir = 'uploads/';
// Her dosyayı işlemek için döngü
foreach ($_FILES['files']['tmp_name'] as $key => $tmpFile) {
// Yüklenen dosyanın adı
$fileName = basename($_FILES['files']['name'][$key]);
// Dosyanın uzantısını alma
$fileExtension = pathinfo($fileName, PATHINFO_EXTENSION);
// Benzersiz dosya adı oluşturma
$newFileName = uniqid() . '.' . $fileExtension;
$uploadFile = $uploadDir . $newFileName;
// Klasörün var olup olmadığını kontrol etme
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true); // Klasör oluşturma
}
// Dosyayı klasöre taşıma
if (move_uploaded_file($tmpFile, $uploadFile)) {
echo "Dosya başarıyla yüklendi: " . htmlspecialchars($newFileName) . "<br>";
} else {
echo "Dosya yükleme sırasında bir hata oluştu: " . htmlspecialchars($fileName) . "<br>";
}
}
}
?>
3. Güvenlik ve Ekstra Kontroller
Çoklu dosya yükleme işlemi sırasında her bir dosya için güvenlik ve kontrol sağlamak önemlidir. Dosya uzantısı ve boyutu kontrolü, güvenliği artırmak için kullanılabilir.
3.1. Dosya Uzantısının Kontrolü
Yalnızca belirli uzantılara sahip dosyaların yüklenmesine izin verilebilir. Örneğin, yalnızca resim dosyalarına izin vermek için her bir dosyanın uzantısını kontrol edebiliriz.
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
if (!in_array(strtolower($fileExtension), $allowedExtensions)) {
die("Yalnızca JPG, PNG, GIF ve PDF dosyalarına izin verilmektedir.");
}
3.2. Dosya Boyutu Kontrolü
Her bir dosyanın boyutunu kontrol ederek belirli bir boyutun üzerinde dosyaların yüklenmesini engelleyebilirsiniz. Örneğin, 2MB boyutundaki dosyaları sınırlandırabiliriz.
$maxFileSize = 2 * 1024 * 1024; // 2MB
if ($_FILES['files']['size'][$key] > $maxFileSize) {
die("Dosya boyutu 2MB'den büyük olamaz: " . htmlspecialchars($fileName));
}
4. Tam Örnek: PHP 8 ile Çoklu Dosya Yükleme ve Güvenlik Kontrolleri
Aşağıda, çoklu dosya yükleme işlemini gerçekleştiren ve güvenlik kontrollerini içeren tam bir örnek bulunmaktadır:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$uploadDir = 'uploads/';
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];
$maxFileSize = 2 * 1024 * 1024; // 2MB
foreach ($_FILES['files']['tmp_name'] as $key => $tmpFile) {
$fileName = basename($_FILES['files']['name'][$key]);
$fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
$fileSize = $_FILES['files']['size'][$key];
// Dosya uzantısı kontrolü
if (!in_array($fileExtension, $allowedExtensions)) {
echo "İzin verilmeyen dosya uzantısı: " . htmlspecialchars($fileName) . "<br>";
continue;
}
// Dosya boyutu kontrolü
if ($fileSize > $maxFileSize) {
echo "Dosya boyutu 2MB'den büyük olamaz: " . htmlspecialchars($fileName) . "<br>";
continue;
}
// Benzersiz dosya adı oluşturma
$newFileName = uniqid() . '.' . $fileExtension;
$uploadFile = $uploadDir . $newFileName;
// Klasörün var olup olmadığını kontrol etme
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true); // Klasör oluşturma
}
// Dosyayı klasöre taşıma
if (move_uploaded_file($tmpFile, $uploadFile)) {
echo "Dosya başarıyla yüklendi: " . htmlspecialchars($newFileName) . "<br>";
} else {
echo "Dosya yükleme sırasında bir hata oluştu: " . htmlspecialchars($fileName) . "<br>";
}
}
}
?>
5. Çoklu Dosya Yükleme İpuçları
- Yükleme Limiti Belirleme: Çok fazla dosya yüklenmesini engellemek için, yükleme sayısını sınırlayabilirsiniz. Örneğin, maksimum 10 dosya yüklenmesine izin verebilirsiniz.
$maxFiles = 10;
if (count($_FILES['files']['name']) > $maxFiles) {
die("En fazla 10 dosya yükleyebilirsiniz.");
}
- Hata Mesajları Gösterimi: Hata mesajlarını daha kullanıcı dostu hale getirmek için formdan gönderilen dosya ismini göstererek hata mesajlarını kullanıcıya iletebilirsiniz.
Sonuç
Bu rehberde, PHP 8 ile çoklu dosya yükleme işlemi anlatıldı. Dosya yüklerken güvenlik açısından uzantı ve boyut kontrolü yaparak uygulamanızın güvenliğini artırabilirsiniz. Aynı zamanda, kullanıcıların aynı anda birden fazla dosya yüklemesini kolaylaştırabilirsiniz.