ما در میان اسکریپت های تحت وب احتیاج به آپلود فایل داریم. به همین منظور نحوه آپلود و ذخیره یک فایل با زبان برنامه نویسی PHP را مورد بررسی قرار میدهیم.
فرم html آپلود فایل
ما باید یک فرم برای انتخاب و ارسال فایل به سمت سرور را در صفحه HTML خود ایجاد کنیم. این فرم مشابه سایر فرم هایی که در صفحات خود ایجاد میکنیم هستند با دو تفاوت اصلی
1- نوع enctype فرم
2- نوع فیلد input
به کد زیر دقت کنید :
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <input type="submit" name="submit" value="آپلود فایل"> </form>
- باید متد فرم ارسالی حتما از نوع post باشد؛ در حالت get عمل نخواهد کرد. فیلد enctype از نوع multipart/form-data بوده و نوع فرمت فیلد ما file می باشد.در پایان هم یک دکمه (Button) برای ارسال فرم هست .
- و در اخر اطلاعات فرم به فایلی به نام upload.php در کنار فایل حاوی فرم ارسال میشود. کار اصلی ما در داخل همین فایل است.
دریافت فایل آپلود شده و مشخصات آن در PHP
در php یک متغیر سراسری (global) به نام $_FILES داریم. این متغیر یک آرایه دو بعدی یا به نوعی یک ماتریس است که اطلاعات مربوط به فایل های آپلود شده را در خود نگه داری میکند؛ به عبارت دیگر اطلاعات مربوط به فایل (یا فایل های) انتخاب شده در فیلدهایی که نوعشان file هست را در هر ایندکس خود قرار میدهد.
ایندکس اول : در متغیر $_FILES مشخص کننده فایل مورد نظر است که همان نام فیلد (ویژگی name در فیلد input) است.
ایندکس دوم : مشخصات فایل مورد نظر ماست.
- به ازای هر فایل، پنج ویژگی در این متغییر ذخیره میشود:
- name : نام واقعی فایل آپلود شده (نام فایل روی سیستم کاربر)
- type : فرمت MIME فایل را مشخص میکند (مثلا image/jpeg)
- tmp_name : مسیر و نام فایل آپلود شده که اکنون در پوشه موقت (temprary) سرور قرار دارد.
- error : ارور برای آپلود فایل (0 به معنای عدم ارور در آپلود فایل است.)
- size : حجم فایل را به بایت (byte) نشان میدهد.
ما تابعی در زبان PHP به نام basename() داریم . این تابع یک مسیر فایل را میگیرد و نام فایل را به ما بازمیگرداند. این تابع یک پارامتر ورودی دوم نیز به صورت اختیاری و از نوع رشته دریافت میکند، در صورتی که فرمت فایل مساوی مقدار مشخص شده در این پارامتر باشد، فرمت (extension) فایل را از رشته بازگردانده شده حذف میکند.
برای دانستن نام فایل میتوانیم با صدا زدن تابع basename() روی ویژگی اول فایل آپلود شده، نام را در یک رشته داشته باشیم.
basename($_FILES["myFile"]["name"]);
ذخیره کردن فایل آپلود شده
بعد که به فایل و اطلاعات آن دسترسی پیدا کردیم.،آنرا در مسیری دلخواه در سرور خود ذخیره میکنیم.
در PHP یک تابع با نام move_uploaded_file() وجود دارد که دو پارامتر ورودی میگیرد:
- پارامتر اول: مشخص کننده مسیر و نام فایل فعلی است. (که در پوشه موقت سرور قرار دارد)
- پارامتر دوم: مشخص کننده مسیر و نام فایل پس از ذخیره سازی است.
اگر بخواهیم فایل های آپلود شده را در مسیر files/ در کنار فایل کد نگه داری کنیم.کد زیر عملیات انتقال و ذخیره فایل را برای ما انجام میدهد:
$fileName = basename($_FILES["image"]["name"]); $fileTemp = $_FILES["image"]["tmp_name"]; move_uploaded_file($fileTemp,"files/".$fileName);
فایل ما با همان نام قبلی خودش در مسیر مورد نظرمان ذخیره شده است.تابع move_uploaded_file() یک مقدار بولین به عنوان خروجی به ما برمیگرداند. در نتیجه میتوانیم نتیجه ذخیره شدن یا نشدن فایل را از این طریق بررسی کنیم.
کار با ویژگی های فایل آپلود شده
همانطور که میدانیم فرآیند آپلود و ذخیره سازی فایل در سیستم اکثر اسکریپت های نوشته شده کمی پیچیده تر و کامل تر است.مثلاً بهتر است فرمت فایل آپلود شده را بررسی کنیم.
بررسی فرمت فایل آپلود شده
برای این کار و با دسترسی به MIME Type فایل، میتوان به راحتی فرمت فایل را بررسی و فیلتر کرد. البته MIME Type مقادیر اضافه تری علاوه بر فرمت را داراست.
- برای اینکه فرمت فایل را از روی نام آن داشته باشیم، میتوان از دو روش استفاده کرد.
- در روش اول: نام فایل را با استفاده از کاراکتر
.
که به عنوان جداکننده نام فایل از فرمت آن استفاده میشود، تکه تکه کرده و سپس آخرین تکه را به عنوان فرمت فایل مورد نظر، برداریم. مشابه کد زیر:
$fileExt = strtolower( end( explode( ".", $_FILES["image"]["name"] ) ) );
- روش دوم: استفاده از تابع basename() روی MIME Type فایل است؛ در اینصورت تابع basename مقدار ورودی را به حالت یک آدرس فایل دیده و بخش آخر (که بعد از آخرین / است) را به عنوان خروجی بازمیگرداند؛ یعنی دقیقا همان چیزی که به دنبالش هستم!
$fileExt = basename($_FILES["myFile"]["type"]);
بررسی حجم فایل آپلود شده
میتوانیم حجم فایل آپلود شده را بررسی کنیم تا بتوانیم اجازه آپلود فایل هایی در محدوده حجمی دلخواهمان را به کاربر بدهیم. برای این کار می بایست کدی مشابه کد زیر داشته باشیم.
if ($_FILES["myFile"]["size"] < 500000){ //less than 500KB //uplaod File }else{ //Show Error! }
بررسی موجود بودن فایلی هم نام با فایل آپلود شده
اگر فایل مقصدی که به عنوان ورودی دوم تابع move_uploaded_file() داده ایم، از قبل موجود باشد، فایل جدید جایگزین آن میشود و ممکن است مشکلاتی را برای اجرای برنامه به وجود بیاورد.
برای بررسی اینکه فایلی با نام مشخص در یک مسیر مشخص قرار دارد یا خیر، میتوان از تابع file_exists() در زبان PHP استفاده کرد.
به کد زیر توجه کنید:
file_exists("files/" . $fileName);
اگر مقدار خروجی کد فوق true بود، به آن معناست که فایلی با همان نام و در مسیر مورد نظرمان وجود دارد.
آپلود فایل در سیستم های بزرگ و تجاری
در سیستم های تحت وب بزرگ که تعداد فایل های آپلود شده زیاد هستند، ممکن است تعداد فایل های هم نام زیاد شوند و کاربران به طور مداوم با خطا جهت آپلود مواجه شوند. البته در صورتی که در منطق برنامه هم نام بودن بررسی شده و جلوی آپلود آن گرفته شود!برای رفع چنین مشکلاتی، بعضا از مسیرهای مختلفی جهت آپلود فایل ها استفاده میکنند. مثلا به هر کاربر یک مسیر مشخص اختصاص میدهند. یا فایل ها را در مسیری که با تاریخ روز مشخص شده قرار میدهند.همچنین میتوان نام فایل آپلود شده را در هنگام ذخیره سازی تغییر داد
بدون دیدگاه