📂 درس سوم: کار با فایلها (File Handling)؛ آپلود، خواندن و مدیریت فایلها
🎯 هدف این درس: یادگیری نحوه خواندن، نوشتن و آپلود فایلها در PHP. همچنین بررسی نکات امنیتی حیاتی برای جلوگیری از آپلود فایلهای مخرب.
مهمان عزیز! 👋
تا اینجا یاد گرفتی چطور دادههای متنی را در دیتابیس ذخیره کنی و هویت کاربر را با Session مدیریت کنی. اما وبسایتهای مدرن فقط متن نیستند؛ آنها پر از تصاویر پروفایل، فایلهای PDF، لوگوها و اسناد هستند.
در این درس یاد میگیریم چگونه با سیستم فایل سرور تعامل داشته باشیم. این مهارت برای ساخت هر سیستمی که نیاز به آپلود عکس یا ذخیره گزارش دارد، ضروری است.
💡 چرا مدیریت فایل مهم است؟
بدون مدیریت صحیح فایلها، سایت شما ممکن است با فایلهای تکراری شلوغ شود، فضای هاست سریع پر شود و از همه مهمتر، راه را برای هکرها باز بگذارد تا کدهای مخرب (Shell) را روی سرور شما آپلود کنند.
📖 مرحله ۱: خواندن و نوشتن در فایلهای متنی
قبل از آپلود، بیایید با توابع پایهای کار کنیم. تابع file_put_contents سادهترین راه برای نوشتن متن در یک فایل است و file_get_contents برای خواندن آن.
file_operations.php
PHP
8.x
<?php
// ۱. نوشتن در فایل (اگر فایل نباشد، ساخته میشود)
$logMessage = "کاربر وارد سیستم شد - " . date('Y-m-d H:i:s');
file_put_contents('logs.txt', $logMessage . "\n", FILE_APPEND);
// ۲. خواندن از فایل
$content = file_get_contents('logs.txt');
echo "<pre>$content</pre>";
📤 مرحله ۲: ساخت فرم آپلود فایل
برای آپلود فایل، فرم HTML باید دو ویژگی حیاتی داشته باشد:
1. method="post"
2. enctype="multipart/form-data" (بدون این ویژگی، فایل ارسال نمیشود!)
upload_form.html
HTML
HTML5
<form action="upload_handler.php" method="POST" enctype="multipart/form-data">
<label for="fileToUpload">انتخاب تصویر:</label>
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="آپلود فایل" name="submit">
</form>
🛡️ مرحله ۳: پردازش و امنیت آپلود (بسیار مهم)
هرگز به پسوند فایل اعتماد نکن! هکرها میتوانند نام shell.php.jpg را انتخاب کنند. ما باید نوع MIME و پسوند را همزمان چک کنیم.
upload_handler.php
PHP
8.x
<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// بررسی اینکه فایل واقعاً تصویر است
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
echo "فایل یک تصویر است - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "فایل یک تصویر نیست.";
$uploadOk = 0;
}
// محدود کردن فرمتهای مجاز
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg") {
echo "فقط فرمتهای JPG, JPEG, PNG مجاز هستند.";
$uploadOk = 0;
}
// تلاش برای آپلود
if ($uploadOk == 0) {
echo "آپلود انجام نشد.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
echo "فایل با موفقیت آپلود شد.";
} else {
echo "خطا در آپلود فایل.";
}
}
❌ خطاهای رایج در آپلود فایل
🚫 اشتباه مرگبار:
اعتماد صرف به پسوند فایل (.jpg). همیشه از تابع getimagesize() یا finfo_file() برای بررسی نوع واقعی فایل (MIME Type) استفاده کنید.
- فراموش کردن پوشه uploads: اگر پوشه مقصد وجود نداشته باشد، آپلود شکست میخورد.
- مجوزهای دسترسی (Permissions): پوشه آپلود باید مجوز نوشتن (Write Permission) داشته باشد (معمولاً 755 یا 775).
- نامگذاری فایل: بهتر است نام فایل را قبل از ذخیره تغییر دهید (مثلاً با اضافه کردن Timestamp) تا فایلهای همنام جایگزین نشوند.
🏁 جمعبندی درس سوم
مهمان عزیز، در این درس یاد گرفتی:
- ✅ چگونه با توابع ساده فایل متنی بسازی و بخوانی.
- ✅ ساختار فرم HTML برای آپلود فایل (enctype).
- ✅ نحوه دریافت اطلاعات فایل از آرایه
$_FILES. - ✅ اصول اولیه امنیت در آپلود (بررسی MIME و پسوند).
🎓 تمرین عملی درس سوم
یک سیستم آپلود پیشرفتهتر بساز که نام فایل را قبل از ذخیرهسازی به یک نام تصادفی (Random) تغییر دهد تا از تداخل نامها جلوگیری شود.
🗺️ نقشه راه دوره: شما اینجا هستید!
برای اینکه بدانی دقیقاً کجای مسیر هستی و چه درسهایی در انتظار توست، به جدول زیر نگاه کن. درس فعلی با رنگ متفاوت مشخص شده است.
| درس | عنوان درس | آنچه یاد میگیرید |
|---|---|---|
| ۱ | ارتباط با دیتابیس (PDO) | اتصال امن به MySQL، جلوگیری از SQL Injection |
| ۲ | مدیریت نشستها (Sessions) | ساخت سیستم لاگین/خروج، مدیریت دسترسی کاربران |
| ۳ | کار با فایلها (File Handling) | آپلود تصویر، خواندن و نوشتن در فایلها |
| ۴ | مدیریت خطاها (Error Handling) | استفاده از Try/Catch، لاگگیری خطاها |
| ۵ | مقدمهای بر شیگرایی (OOP) | کلاس، شیء، متد، ویژگیها |
| ۶ | ساختاردهی پروژه (MVC مقدماتی) | جداسازی منطق از ظاهر، فایلهای Config |
| ۷ | امنیت پیشرفته | هش کردن پسورد، محافظت در برابر XSS و CSRF |
| ۸ | کار با API (مقدماتی) | دریافت داده از API خارجی (cURL)، JSON |
| ۹ | پروژه نهایی سطح متوسط | ساخت وبلاگ کامل با قابلیت لاگین و مدیریت |



