تعداد بازدید: 3100

FileSystem در PHP

رفتار تابعی در مقابله با فایل ها و دایرکتوری ها دقیقا مثل رفتار نرم افزار های FileManager ها در سیستم عامل هاست. Action ها و ویژگی های یک فایل یا دایرکتوری و همچنین نحوه ویرایش و یا ساخت فایل.

در سیستم عامل های مبتنی بر Unix ما File و Directory داریم. در زبان PHP نیز توابعی مرتبط با فایل ها و دایرکتوری ها داریم.

برای دسترسی به فایل ها ما به مسیر آن فایل در سیستم عامل نیاز داریم. برای آدرس دهی باید از مسیر جاری اقدام کنیم که برای بدست آوردن مسیر جاری از ثابت __DIR__ استفاده می کنیم. دقت داشته باشید که PATH با URL متقاوت است.

برای ساخت ، نوشتن ، بروزرسانی و خواندن فایل باید سه مرحله را انجام دهید:

  • fopen: باز کردن فایل . در این مرحله باید mod فایل را مشخص کنید.
  • ACTION : هر عملیاتی با توجه به mod که با آن فایل را باز کرده اید انجام دهید مثل نوشتن ، الحاق ، ایجاد و …
  • fclose : بستن فایل . در این مرحله cursor با توجه به ACTION هر تغییری کرده باشد به حالت اولیه بر می گردد.

فایل را از روی مسیر آن باز می کنیم و محتوای آن را می خوانیم و بعد آن را می بندیم. در این مثال handler فایل بعد از باز شدن و همچنین mod باز شدن آن در طی ادامه مسیر مهم می باشد.

mod های باز کردن فایل با شکل زیر خلاصه شده است :

نام مد عملیات موقعیت CURSOR اگر فایل موجود نباشد اگر فایل از قبل موجود باشد
r خواندن ابتدای فایل خطا می دهد الزامی است
r+ خواندن/نوشتن ابتدای فایل خطا می دهد الزامی است
w نوشتن ابتدای فایل یک فایل ایجاد می کند فایل را باز می کند و محتویات را پاک می کند
w+ خواندن/نوشتن ابتدای فایل یک فایل ایجاد می کند فایل را باز می کند و محتویات را پاک می کند
a افزودن انتهای فایل یک فایل ایجاد می کند فایل را باز کرده و محتویات جدید را به آن اضافه می کند
a+ خواندن/افزودن انتهای فایل یک فایل ایجاد می کند فایل را باز کرده و محتویات جدید را به آن اضافه می کند
x نوشتن ابتدای فایل یک فایل ایجاد می کند FALSE بر میگرداند
x+ خواندن/نوشتن ابتدای فایل یک فایل ایجاد می کند FALSE برمیگرداند

ACTION که در مرحله قبل توضیح دادیم می تواند یکی از موارد زیر باشد:

fwrite : این تابع برای نوشتن در فایل استفاده می گردد که محتویات جدید و handler قبلی را می گیرد و با توجه به mode عملیات نوشتن را انجام می دهد.

$fp = fopen('data.txt', 'w');
fwrite($fp, '23');
fclose($fp);

نکته : این که محتوای جدید را الحاق کند یا این که روی محتوای قبل بنویسد(محتوای قبل را پاک کند) بسته به نوع مد باز شدن فایل در مرحله قبل دارد.

fread : در این تابع محتویات فایل را می خوانیم :

$handle = fopen("directory/data.txt", "r");
$content = fread($filename); 
fclose($handle);

نکته : همچنین ما توابعی داریم که با استفاده از آن ها می توان به صورت کاراکتری یا رشته ای خواند. با استفاده از تابع fgetc کاراکتری و تابع fgets رشته ای محتویات فایل را می توان گرفت. در استفاده از این توابع ما تا زمانی که فایل را نبسته باشیم موقعیت cursor تغییری نمی کند.

توابع ACTION در ابتدای خود f دارند و باید file pointer را به آن ها بدهیم . همچنینم mod کنترل ACTION در آن ها مهم می باشد.

Files Magic constants

__DIR__ : فرض کنید که یک کلاس در مسیر inc با نام controller.php دارید. در روت پروژه فایلی با نام index.php دارید . حال در یکی از متد های فایل کلاس controller می خواهید فایلی با نام assets.json را بخوانید.

inc/
   controller.php
   assets.json
index.php

این کلاس در فایل index.php فراخوانی می شود. مسیری که می دهید باید از روت باشد مگر این که در متد کلاس از ثابت __DIR__ استفاده کرده باشید. این ثابت مسیر فایل جاری را از ابتدای هاست (کاربر سیستم عامل سرور) می دهد و شما نیاز به در نظر گرفتن محل فراخوانی فایل جاری برای مسیر دهی ندارید.

داخل متد controller کافیست به این شکل فایل assets.json را بخوانیم:

$content = file_get_content( __DIR__ . "assets.json" , true );

__FILE__ : مسیر کامل فایل جاری را می دهد (full path and filename) همچنین تابع dirname مسیر را از روی مسیر فایل بر میگرداند که مرتبط با این ثابت است.

__DIR__/dirname(__FILE__)/

نکته : برای بدست آوردن ریشه پروژه از متغیر $_SERVER['DOCUMENT_ROOT'] استفاده می کنیم. به طور مثال میخواهیم در template های داخلی یک کتابخانه یا فایل را فراخوانی کنیم:

include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';

Files and Directory Fucntions

file_exists : برای چک کردن این که فایل موجود است یا خیر . معمولا قبل از باز کردن فایل برای جلوگیری از خطا برای مد هایی که در صورت نبود فایل خطا می دهند با این تابع چک می کنیم.

is_dir , is_file : برای چک کردن این که وردی داده شده فایل یا دایرکتوری است.

mkdir , rmdir : برای ایجاد یا حذف یک دایرکتوری.

filetype , filesize , filemtime : این توابع برای دریافت اطلاعات فایل ها نظیر size , type , created date , modified date می باشند.

rename : این تابع برای تغییر نام و جابجایی فایل استفاده می شود و عملکردی مشابه دستور mv در BashScript دارد.

copy : برای کپی فایل . برای cut کردن فایل باید از تابع renmae استفاده کنیم.

unlink : برای حذف فایل استفاده می شود.


disk_free_space , disk_total_space : برای محاسبه فضای باقیمانده و فضای کل یک مسیر .

glob : این تابع پر کاربرد لیست فایل هایی مسیر جاری را با استفاده از یک pattern بر می گرداند.


readfile : این فایل برای خواندن و چاپ محتویات فایل می باشد.

file_get_content , file_put_content : این توابع برای خواندن و نوشتن روی کل فایل می باشد. این توابع باز و بستن فایل را در خود دارند و نیازی به مد و handler ندارند.

//file_get_content : calling fopen(), fread() and fclose() successively
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
//file_put_content :  calling fopen(), fwrite() and fclose() successively
$file = 'people.txt';
$current = "John Smith\n";
file_put_contents($file, $current);

نکته : گاها از تابع file_get_content برای کار بار وب سرویس ها استفاده می شود. مثلا درخواست ها را از طریق url به آن می دهیم و خروجی را می گیریم.

move_uploaded_file : این تابع برای انتقال فایل از مسیر موقت به مسیر اصلی می باشد. این تابع و دو تابع قبل عملکردی حدودا مشابه دارند. در زمان آپلود فایل از طریق درخواست های FILES از این تابع استفاده می کنیم.

FILES Predefined Variable

زمانی که یک فرم برای آپلود فایل به صورت single , multiple می سازید باید ابتدا enctype آن را به فرم با مقدار multipart/form-data بدهید که برای file handling از متغیر $_FILES استفاده می کنید و برای سایر فیلد ها (اعم از متنی و رادیو چک باکس) از متغیر $_POST استفاده می کنیم.

<?php $max = 1024 * 100; ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
   <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max; ?>">
   <input type="file" name="image" >
   <input type="submit" name="send_photo" value="send" >
</form>

خروجی متغیر $_FILES را که print بگیریم به شکل زیر است :

array(    
    [image] => Array
        (
            [name] => MyFile.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/php/php6hst32
            [error] => 0
            [size] => 98174
        )
)
  • name : نام فایل آپلود شده
  • type : نوع فایل آپلود شده
  • tmp_name : مسیری که موقتا فایل در آن قرار گرفته است.
  • error : خطاهایی که به صورت یک عدد از 0 تا 8 می باشد که هر کدام معنی خود را دارد و به یک رشته خاص مپ می گردد.مثلا 0 یعنی UPLOAD_ERR_OK
  • size : اندازه فایل آپلود شده به بایت (Byte)

اگر به صورت multiple فایل را آپلود کرده باشیم یعنی نام input[type=”file”] را آرایه در نظر گرفته و ویژگی multiple را به آن اضافه کرده باشیم به صورت آرایه ای برمی گردد که به شکل زیر است (حتی اگر یک فایل آپلود کرده باشید هر ویژگی یک آرایه است با اندازه 1)

Array
(
    [name] => Array
        (
            [0] => Image1.jpg
            [1] => Image2.jpg
        )
    [type] => Array
        (
            [0] => image/jpeg
            [1] => image/jpeg
        )
    [tmp_name] => Array
        (
            [0] => C:\xampp\tmp\phpE85.tmp
            [1] => C:\xampp\tmp\phpE86.tmp
        )
    [error] => Array
        (
            [0] => 0
            [1] => 0
        )
    [size] => Array
        (
            [0] => 190141
            [1] => 44029
        )
)

در نهایت باید با استفاده از تابع move_uploaded_file فایل را از مسیر موقت به مسیر فایل های خود در پروژه منتقل کنیم.

$upload_name = $_FILES['image']['name'];
$upload_type = $_FILES['image']['type'];
$upload_tmp = $_FILES['image']['tmp_name'];
$upload_error = $_FILES['image']['error'];
$destination = __DIR__ . "/uploads/{$upload_name}";
move_uploaded_file($upload_tmp,$destination);

به ازای هر فایل آپلود شده باید مسیر ، نوع ، سایز و نام آن را در پایگاه داده ذخیره کنید تا بعد بتوانید به آن دسترسی پیدا کنید.

مطالب مشابه

هدر های Http در درخواست و پاسخ

Http Headers (قسمت اول)

هر گاه اطلاعاتی را از سرور نیاز داشته باشیم باید یک درخواست به آن بزنیم و پاسخ را از سمت سرور دریافت کنیم. بر این...

کوکی ها و نشست ها و راه های ذخیره سازی داده د ر php

Cookie و Session در php

زمانی که بحث ذخیره اطلاعات که مطرح میشه ما امکاناتی برای ذخیره اطلاعاتمون داریم: پایگاه داده (DataBase) فایل ها...

هدر های Http در درخواست و پاسخ

Http Headers (قسمت سوم)

Http Request و Http Response درخواست و پاسخ بر اساس پروتکل Http می باشند و می توان از این ها برای ارتباط میان نرم افزار...

xml in php , dom document

کار با XML در PHP

XML مخفف (eXtensible Markup Language - زبان نشانه گذاری توسعه پذیر) طراحی شده برای ذخیره و انتقال اطلاعات می باشد. XML...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای FileSystem در PHP

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *