شرح رفع الملفات (File Upload) في PHP
رفع الملفات ميزة مهمة في تطبيقات كثيرة: صورة حساب، مرفقات، مستندات، أو ملفات منتج. لكن في نفس الوقت تعتبر من أكثر النقاط حساسية أمنياً.
في هذا الدرس ستتعلم الطريقة الصحيحة لرفع الملفات في PHP باستخدام $_FILES وmove_uploaded_file()
مع أهم قواعد الحماية.
المتطلبات الأساسية لرفع الملفات
- النموذج يجب أن يكون
method="POST". - إضافة
enctype="multipart/form-data"داخلform. - وجود حقل
input type="file"معname.
مثال 1: نموذج HTML لرفع ملف
الكود:
<form action="upload.php" method="POST" enctype="multipart/form-data">
اختر صورة: <input type="file" name="myImage">
<button type="submit">رفع الملف</button>
</form>
مثال 2: استقبال ونقل الملف في PHP
الكود في upload.php:
<?php
$targetDir = "uploads/";
$fileName = basename($_FILES["myImage"]["name"]);
$targetFile = $targetDir . $fileName;
if (move_uploaded_file($_FILES["myImage"]["tmp_name"], $targetFile)) {
echo "تم رفع الملف بنجاح";
} else {
echo "حدث خطأ أثناء رفع الملف";
}
?>
شرح كود PHP:
$_FILES["myImage"]يحتوي بيانات الملف المرفوع.tmp_nameهو المسار المؤقت للملف قبل الحفظ النهائي.move_uploaded_file()تنقل الملف إلى مجلدك الدائم.
بنية $_FILES باختصار
| المفتاح | المعنى |
|---|---|
name |
اسم الملف الأصلي |
type |
نوع الملف المرسل من المتصفح |
size |
حجم الملف بالبايت |
tmp_name |
المسار المؤقت على الخادم |
error |
كود خطأ الرفع إن وجد |
أهم قواعد الأمان عند رفع الملفات
- تحقق من الامتداد المسموح (مثل:
jpg,png,pdf). - حدد حداً أقصى لحجم الملف.
- غيّر اسم الملف إلى اسم فريد (مثل
uniqid()). - لا تسمح برفع ملفات تنفيذية مثل
.phpأو.exe. - احفظ الملفات في مجلد لا يسمح بتنفيذ السكربتات.
أخطاء شائعة للمبتدئين
- نسيان
enctype="multipart/form-data"في النموذج. - استعمال
$_POSTبدل$_FILESلقراءة الملف. - عدم التحقق من قيمة
$_FILES[...]["error"]. - استخدام الاسم الأصلي للملف مباشرة دون تغييره.
تمرين تطبيقي سريع
- أنشئ نموذج رفع صورة باسم حقل
avatar. - اسمح فقط بامتدادي
jpgوpng. - حدد الحجم الأقصى بـ 2MB.
- احفظ الملف باسم فريد داخل مجلد
uploads.
الأسئلة الشائعة — FAQ
كيف أرفع ملفاً في PHP؟
عبر نموذج POST مع multipart/form-data ثم نقل الملف بـ move_uploaded_file().
ما فائدة enctype="multipart/form-data"؟
بدونها لن يتم إرسال الملف بشكل صحيح من المتصفح إلى الخادم.
ما وظيفة $_FILES؟
تحتوي كل معلومات الملف المرفوع: الاسم، الحجم، النوع، المسار المؤقت، وحالة الخطأ.
كيف أؤمن رفع الملفات؟
بالتحقق من النوع والحجم، منع الامتدادات الخطرة، وتخزين الملفات بأسماء فريدة.