🚀 كيف تجعل موقعك يستقبل الملفات؟ تعلم رفع الملفات في PHP

اليوم سننتقل إلى خطوة مهمة جداً في تطوير المواقع، وهي تمكين المستخدم من إرسال ملف (مثل صورة أو مستند PDF) من جهازه الخاص إلى خادمك (Server).

عملية رفع الملفات قد تبدو مخيفة في البداية، لكنها في الحقيقة عبارة عن خطوات بسيطة ومنظمة. لنبدأ معاً! 💻


📝 الخطوة الأولى: إنشاء نموذج HTML المناسب

لكي نتمكن من رفع ملف، لا يكفي استخدام نموذج form عادي. هناك شرطان أساسيان يجب توفرهما في كود HTML لكي يعمل رفع الملفات:

  1. الخاصية method="post": يجب أن تكون طريقة إرسال البيانات هي POST دائماً، لأن الملفات حجمها كبير ولا يمكن إرسالها عبر GET.
  2. الخاصية enctype="multipart/form-data": هذا هو "السر" في رفع الملفات. بدون هذه الخاصية، لن يتم إرسال الملف إلى السيرفر، وسيتجاهله PHP تماماً.

إليك الكود البسيط لإنشاء النموذج:

<!-- upload.html -->
<!DOCTYPE html>
<html>
<head>
    <title>File Upload Page</title>
</head>
<body>

    <h2>Upload Your Image 🖼️</h2>
    <!-- لاحظ وجود enctype وهي ضرورية جداً لرفع الملفات -->
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="myFile">
        <input type="submit" value="Upload Now">
    </form>

</body>
</html>

📂 الخطوة الثانية: فهم المصفوفة السحرية $_FILES

في الدروس السابقة، تعلمنا أن البيانات النصية من النموذج تصلنا عبر $_POST. لكن في حالة الملفات، PHP لا يضعها في $_POST بل يضعها في مصفوفة خاصة جداً تسمى $_FILES.

عندما ترفع ملفاً باسم myFile (كما في المثال السابق)، فإن PHP ينشئ مصفوفة تحتوي على معلومات مفصلة عن هذا الملف:

  • $_FILES['myFile']['name']: اسم الملف الأصلي على جهاز المستخدم (مثلاً: photo.jpg).
  • $_FILES['myFile']['tmp_name']: المسار المؤقت للملف. (عندما يرفع المستخدم ملفاً، يقوم PHP بتخزينه في مكان مؤقت على السيرفر أولاً).
  • $_FILES['myFile']['size']: حجم الملف بالبايت.
  • $_FILES['myFile']['error']: كود يخبرنا هل حدث خطأ أثناء الرفع أم لا.

🛠️ الخطوة الثالثة: نقل الملف من "المكان المؤقت" إلى "المجلد الدائم"

تذكر أن الملف حالياً موجود في "مجلد مؤقت" على السيرفر، وإذا انتهى تنفيذ الكود ولم ننقله، سيقوم السيرفر بحذفه تلقائياً! 😱

لهذا السبب نستخدم دالة برمجية جاهزة في PHP تسمى: move_uploaded_file().

وظيفة هذه الدالة: تأخذ الملف من مكانه المؤقت (tmp_name) وتنقله إلى المجلد الذي تحدده أنت.

إليك الكود الكامل لملف upload.php:

<?php
// 1. تحديد المجلد الذي سنحفظ فيه الملفات
// يجب أن يكون هذا المجلد موجوداً بالفعل في مشروعك
$targetDirectory = "uploads/";

// 2. الحصول على اسم الملف من المصفوفة _FILES
$fileName = $_FILES["myFile"]["name"];

// 3. تحديد المسار النهائي (المجلد + اسم الملف)
$targetFilePath = $targetDirectory . $fileName;

// 4. محاولة نقل الملف من المكان المؤقت إلى المجلد الدائم
if (move_uploaded_file($_FILES["myFile"]["tmp_name"], $targetFilePath)) {
    echo "The file has been uploaded successfully! ✅";
} else {
    echo "Sorry, there was an error uploading your file. ❌";
}
?>

⚠️ ملاحظات هامة جداً للمبتدئين

لضمان عمل الكود معك بنجاح، يرجى الانتباه للنقاط التالية:

  1. إنشاء المجلد: تأكد من إنشاء مجلد باسم uploads في نفس المسار الذي يوجد به ملفات الـ PHP الخاصة بك، وإلا سيفشل الرفع.
  2. صلاحيات المجلد: في بعض الأنظمة (مثل Linux)، يجب أن يكون لمجلد الـ uploads صلاحية "الكتابة" لكي يتمكن PHP من وضع الملفات داخله.
  3. تطابق الأسماء: تأكد أن الاسم الموجود في name="myFile" في HTML هو نفسه المستخدم في $_FILES["myFile"] في PHP.

🎓 ملخص سريع لما تعلمناه:

  1. استخدمنا enctype="multipart/form-data" في نموذج HTML.
  2. عرفنا أن الملفات تصل عبر مصفوفة $_FILES وليس $_POST.
  3. استخدمنا دالة move_uploaded_file() لنقل الملف من التخزين المؤقت إلى مجلدنا الخاص.