التعامل مع تحميل الملفات
عالجوا الملفات المحمّلة بأمان باستخدام المتغير العام الفائق _FILES
التعامل مع تحميل الملفات درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.
نظرة عامة على رفع الملفات في PHP
يعالج PHP عمليات رفع الملفات عبر المتغير العام الفائق $_FILES. ويجب أن يستخدم النموذج method="POST" وenctype="multipart/form-data".
نموذج رفع HTML
إعداد نموذج HTML لرفع ملف واحد أو عدة ملفات:
<!-- Single file -->
<form method="POST" action="upload.php"
enctype="multipart/form-data">
<input type="file" name="document">
<button>Upload</button>
</form>
<!-- Multiple files -->
<form method="POST" enctype="multipart/form-data">
<input type="file" name="photos[]" multiple>
<button>Upload All</button>
</form>بنية $_FILES
يحتوي كل ملف مرفوع على خمسة إدخالات في $_FILES:
<?php
$file = $_FILES['document'];
echo $file['name']; // original name: report.pdf
echo $file['type']; // browser-reported MIME: application/pdf
echo $file['tmp_name']; // server temp path: /tmp/phpXXXXXX
echo $file['error']; // error code: 0 = UPLOAD_ERR_OK
echo $file['size']; // file size in bytesرموز أخطاء الرفع
تحققوا دائمًا من $file['error'] قبل المعالجة:
<?php
$errorMessages = [
UPLOAD_ERR_INI_SIZE => 'Exceeds upload_max_filesize in php.ini',
UPLOAD_ERR_FORM_SIZE => 'Exceeds MAX_FILE_SIZE in form',
UPLOAD_ERR_PARTIAL => 'Only partially uploaded',
UPLOAD_ERR_NO_FILE => 'No file uploaded',
UPLOAD_ERR_NO_TMP_DIR => 'Missing temp folder',
UPLOAD_ERR_CANT_WRITE => 'Failed to write to disk',
UPLOAD_ERR_EXTENSION => 'PHP extension stopped upload',
];
$err = $_FILES['doc']['error'];
if ($err !== UPLOAD_ERR_OK) {
die($errorMessages[$err] ?? 'Unknown error');
}التحقق الآمن من نوع الملف
لا تثقوا أبدًا بنوع MIME الذي يرسله المتصفح — تحققوا منه باستخدام المحتوى الفعلي للملف:
<?php
$tmp = $_FILES['image']['tmp_name'];
$allowed = ['image/jpeg', 'image/png', 'image/webp'];
// Check real MIME type from file content
$realMime = mime_content_type($tmp);
if (!in_array($realMime, $allowed)) {
die('Invalid file type: ' . $realMime);
}التحقق من حجم الملف
فرضوا حدود الحجم على الخادم حتى إذا كان نموذج HTML يحتوي على حقل MAX_FILE_SIZE مخفي:
<?php
$maxBytes = 5 * 1024 * 1024; // 5MB
$size = $_FILES['video']['size'];
if ($size > $maxBytes) {
$mb = round($size / 1024 / 1024, 2);
die("File too large: {$mb}MB (max 5MB)");
}is_uploaded_file وmove_uploaded_file
استخدموا هاتين الدالتين دائمًا للتأكد من أن الملف وصل عبر رفع HTTP ولنقله بأمان:
<?php
$tmp = $_FILES['photo']['tmp_name'];
$dest = '/var/www/uploads/' . basename($_FILES['photo']['name']);
if (!is_uploaded_file($tmp)) {
die('Not an uploaded file — possible attack');
}
if (!move_uploaded_file($tmp, $dest)) {
die('Failed to move uploaded file');
}
echo 'Upload saved to: ' . $dest;إنشاء أسماء ملفات آمنة
أنشئوا اسم ملف عشوائيًا لمنع هجمات اجتياز الدليل والكتابة فوق الملفات:
<?php
$originalName = $_FILES['doc']['name'];
$ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
$allowedExts = ['jpg', 'jpeg', 'png', 'pdf'];
if (!in_array($ext, $allowedExts)) {
die('File type not allowed');
}
$safeName = bin2hex(random_bytes(16)) . '.' . $ext;
$dest = '/var/www/uploads/' . $safeName;
move_uploaded_file($_FILES['doc']['tmp_name'], $dest);معالجة رفع عدة ملفات
عند استخدام name="photos[]"، يحتوي $_FILES على مصفوفات — كرروا عبرها:
<?php
$files = $_FILES['photos'];
$count = count($files['name']);
for ($i = 0; $i < $count; $i++) {
if ($files['error'][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $files['tmp_name'][$i];
$ext = pathinfo($files['name'][$i], PATHINFO_EXTENSION);
$dest = '/uploads/' . uniqid() . '.' . strtolower($ext);
move_uploaded_file($tmp, $dest);
echo "Saved: $dest" . PHP_EOL;
}إعدادات رفع الملفات في php.ini
توجيهات php.ini الأساسية التي تؤثر في رفع الملفات:
file_uploads = On— تفعيل الرفعupload_max_filesize = 8M— الحد الأقصى لحجم الملف الواحدpost_max_size = 32M— الحد الأقصى لحجم نص POST (ويجب أن يكون أكبر من upload_max_filesize)max_file_uploads = 20— الحد الأقصى لعدد الملفات في الطلب
تغيير حجم الصور بعد الرفع
استخدموا مكتبة GD لتغيير حجم الصور بعد رفعها:
<?php
function resizeImage(string $src, string $dst, int $maxW): void {
[$w, $h, $type] = getimagesize($src);
$ratio = $maxW / $w;
$newH = (int) ($h * $ratio);
$srcImg = imagecreatefromjpeg($src);
$dstImg = imagecreatetruecolor($maxW, $newH);
imagecopyresampled($dstImg, $srcImg, 0,0,0,0, $maxW, $newH, $w, $h);
imagejpeg($dstImg, $dst, 90);
imagedestroy($srcImg);
imagedestroy($dstImg);
}تحقق سريع
ما دالة PHP المطلوبة لنقل ملف مرفوع بأمان إلى وجهته النهائية؟
مراجعة: رفع الملفات
قائمة التحقق من معالجة الرفع:
- يجب أن يستخدم النموذج
method=POST enctype=multipart/form-data - تحققوا من
$_FILES['field']['error'] === UPLOAD_ERR_OK - تحققوا من نوع MIME الفعلي باستخدام
mime_content_type() - تحققوا من حجم الملف على الخادم
- استخدموا
move_uploaded_file()— وليس rename أو copy - أنشئوا أسماء ملفات عشوائية لمنع التعارضات
الأسئلة الشائعة
هل درس «التعامل مع تحميل الملفات» مجاني؟
نعم — نص درس «التعامل مع تحميل الملفات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.
ماذا ستتعلم في «التعامل مع تحميل الملفات»؟
عالجوا الملفات المحمّلة بأمان باستخدام المتغير العام الفائق _FILES تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟
لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التعامل مع تحميل الملفات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟
نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- قراءة الملفات باستخدام PHP
- الكتابة إلى الملفات وإضافة البيانات إليها
- التعامل مع المجلدات
- التعامل مع تحميل الملفات