آپلود فایل

PHP این امکان را به شما می دهد که به کاربران اجازه دهید فایل های خودشان(عکس، فیلم و…) را در سرور شما آپلود کنند. البته این آپلود کردن فایل باید با اعتبار سنجی و ایجاد محدودیت همراه باشد تا کاربران نتوانند هر گونه فایلی را آپلود کنند. برای اضافه کردن این قابلیت (آپلود فایل) به سایت باید یک فرم به صورت زیر ایجاد کنید :

<form enctype="multipart/form-data" method="POST">

    <input type="file" name="file"/>
    <br>
    <input type="submit" name="submit" value="Upload">
    
</form>

همانطور که در کد بالا مشاهده می کنید فرم باید دارای خاصیت enctype=”multipart/form-data” و نوع دکمه هم باید file باشد،از این دکمه برای انتخاب فایل استفاده می شود. همچنین اطلاعات باید به روش POST ارسال شوند. خروجی کد بالا به صورت زیر است :
Upload-Files-in-PHP-1
این ساده ترین شکل ایجاد یک فرم آپلود است. حال اگر بر روی دکمه Browse کلیک کنید پنجره ای به صورت زیر به نمایش در می آید :
Upload-Files-in-PHP-2
همانگونه که در شکل مشاهده می کنید هر نوع فایلی قابل انتخاب است و کاربر هیچ محدودیتی در انتخاب فایل ندارد.در آپلود فایل ها با یک آرایه سراسری به نام $_FILES سر و کار داریم. این آرایه اطلاعاتی در مورد فایل های آپلود شده در اختیار ما می گذارد. برای آشنا شدن با کارکرد این آرایه کدهای اول درس را به صورت زیر تغییر دهید :

<form enctype="multipart/form-data" method="POST">

    <input type="file" name="file"/>
    <br>
    <input type="submit" name="submit" value="Upload">
    
</form>

<?php
   echo '<pre>';
   print_r($_FILES);
   echo '</pre>';  
?>

کد را ذخیره، اجرا و بر روی دکمه Upload کلیک کنید :

UploadFiles-php-1
همانطور که در شکل بالا مشاهده می کنید، چون هنوز فایلی آپلود نشده، آرایه $_FILES خالی می باشد. حال یک عکس انتخاب می کنیم (مثلا عکس Koala.jpg) و سپس بر روی دکمه آپلود کلیک می کنیم :
UploadFiles-php-2
مشاهده می کنید که آرایه $_FILES خود آرایه ای از آرایه ها است. در اینجا آرایه file که نام دکمه Browse است (name=”file”)درون آرایه $_FILES قراردارد. طبیعی است که برای دسترسی به مقدار عنصر name آرایه file باید به صورت زیر عمل کنیم :

$_FILES["file"]["name"]

هر فایلی که آپلود می شود مشخصاتی از آن در آرایه ای همنام با دکمه Browse آن ذخیره می شود. در جدول زیر در مورد هر کدام از این مشخصات توضیح داده شده است :

خاصیت توضیح
name نام فایلی که آپلود شده است
type نوع فایلی که آپلود شده است
tmp_name مسیر موقتی در سرور است که فایلها در آن ذخیره می شوند.
error خطایی که در هنگام آپلود رخ می دهد.
size سایز فایلی که آپلود شده است

همانطور که اشاره شد باید برای کاربر محدودیت هایی در آپلود فایل یجاد کنیم. فرض کنید می خواهیم به کاربر حق انتخاب فقط عکس را بدهیم. برای این کار لازم است که فرم را طوری برنامه نویسی کنیم که فقط پسوند های مجاز عکس (jpg,jpeg,PNG و …) را قبول کند. دو تابع از پیش تعریف شده در PHP وجود دارند که این کار را برای ما انجام می دهند، explode و end ، اما چگونه؟ به کد زیر توجه کنید :

  1: <form enctype="multipart/form-data" method="POST">
  2: 
  3:     <input type="file" name="file"/>
  4:     <br>
  5:     <input type="submit" name="submit" value="Upload">
  6: 	
  7: </form>
  8: <?php
  9:     if(isset($_POST['submit']))
 10:     {
 11:         $Allowextension = array("gif", "jpeg", "jpg", "png");
 12:         $FileExtension = explode(".", $_FILES["file"]["name"]);
 13:         $extension = end($FileExtension);
 14:         if (in_array($extension, $Allowextension))
 15:         {
 16:             if ($_FILES["file"]["error"] == 0)
 17:             {
 18:                 echo 'File upload successfuly!';
 19:             }
 20:             else
 21:             {
 22:                 echo 'Error in uploading File!';
 23:             }
 24:         }
 25:         else
 26:         {
 27:             echo 'Invalid file';
 28:         }
 29:     }
 30: ?>

ابتدا در خط 11 پسوندهایی که قرار است فرم قبول کند را درون یک آرایه می نویسیم:

$Allowextension = array("jpg","jpeg","PNG");

سپس در خط 12 پسوند فایلی را که کاربر انتخاب کرده است را به دست می آوریم. اینجاست که کاربرد تابع explode مشخص می شود. این تابع یک رشته را می گیرد و آن را بر اساس کاراکتری که خودمان مشخص می کنیم تکه تکه و سپس در یک آرایه قرار می دهد. به کد زیر توجه کنید :

$FileExtension= explode(".", $_FILES["file"]["name"]);

در کد بالا ما نام فایل را که Koala.jpg است را بر اساس علامت نقطه ( . ) تکه تکه می کنیم. خروجی تابع explode یک آرایه است. پس $FileExtension در کد بالا به صورت زیر است :

$FileExtension= array("Koala","jpg");

چون ما فقط عنصر آخر این آرایه را که همان پسوند فایل است می خواهیم پس در خط 13 با استفاده از تابع ()end که آخرین عضو یک آرایه را بر می گرداند مقدار این عنصر را به دست می آوریم :

$extension = end($FileExtension);

تابع in_array نیز چک می کند که آیا یک عنصر که مورد نظر ماست در داخل یک آرایه وجود دارد یا نه؟ در خط 14 با دستور if چک می کنیم که اگر پسوندی که به دست آورده ایم در داخل پسوندهای مجاز بود اجازه اجرای دستورات بعدی داده شود. در بدنه دستور if و در خط 16 هم چک می کنیم که اگر مقدار خطایی که هنگام آپلود فایل رخ داده است 0 باشد یعنی فایل آپلود شده باشد پیغام مناسب به کاربر نمایش داده شود. برای ایجاد محدودیت در اندازه فایل آپلودی هم می توانید خط 14 کد بالا را به صورت زیر تغییر دهید :

if (in_array($extension, $Allowextension) && ($_FILES["file"]["size"] <= 20971520))

در کد بالا گفته ایم که فرم اجازه آپلود عکسهایی که اندازه آنها کوچکتر یا مساوی دو مگابایت است، را به کاربر بدهد. اندازه را باید بر حسب بایت بدهیم. همانطور که گفتیم tmp_name مسیر موقتی است که فایل ها در آن ذخیره می شوند. تا کنون هر چه فایل با استفاده از کدهای بالا آپلود کرده ایم در این مسیر ذخیره شده اند. فرض کنید که می خواهیم فایل ها در مثلا پوشه ای به نام uploads در درایو :C ذخیره شوند. برای این کار از متد ()move_uploaded_file استفاده می شود. ابتدا یک پوشه به نام uploads در درایو :C ایجاد کنید و سپس کد زیر را در بالای خط 16 کد بالا بنویسید :

move_uploaded_file($_FILES["file"]["tmp_name"],  'C:\uploads/'.$_FILES["file"]["name"]);

همانطور که در کد بالا مشاهده می کنید این تابع دو آرگومان می گیرد، یکی مسیر موقتی که فایل در آن قرار دارد و دیگری مسیری که قرار است فایل به آنجا منتقل شود. با اجرای برنامه و انتخاب یک عکس و زدن دکمه Upload عکس به مسیر جدید منتقل می شود :
Upload-Files-in-PHP-7

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر مطرح بفرمایید.