مدیریت فایلها در PHP قسمت سوم : پروتکل FTP

آذر ۲۹, ۱۳۹۱ توسط : سعید

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

FTP چیست؟

FTP یا File Transfer Protocol یک پروتکل انتقال فایل بر پایه TCP/IP می باشد.از این پروتکل برای انتقال فایل ها بین هاست استفاده میشود.در این قسمت با هم یک کلاس کار با FTP خواهیم ساخت.

قبل از اینکه شروع به ساخت کلاس کار با FTP کنیم نگاه کلی به کار این کلاس می اندازیم :

–          اتصال به سرور

–          ساخت پوشه روی سرور

–          آپلود فایل

–          تغییر مسیر

–          لیست کردن اطلاعات یک پوشه خاص

–          دانلود فایل

چه زمانی باید از FTP استفاده کنیم ؟

استفاده از FTP کاربردهای زیادی دارد. اما شاید بیشترین کاربردهای این پروتکل موارد زیر باشد :

–          ساخت یک گالری تصاویر برای سایت و آپلود عکسها توسط کاربر

–          پشتیبان گیری از اطلاعات و محتویات سایت و دیتابیس

مرحله اول : آماده کردن مقدمات

در این مرحله ما دو فایل با نامهای index.php و ftp_class.php خواهیم ساخت.

فایل Index.php صفحه اصلی ماست.جایی که از کلاس یک شیء ایجاد کرده و متدهای مورد نظر را فراخوانی میکنیم.

فایل ftp_class.php فایلی است که کلاس کار با FTP را در آن خواهیم نوشت.

مرحله دوم : ساخت کلاس

یکی از مزیتهای برنامه نویسی شیء گرا این است که میتوان از کدهای نوشته شده در آینده نیز استفاده کرد.برای همین در این آموزش از برنامه نویسی شیء گرا کمک خواهیم گرفت.

حالا فایل ftp_class.php را باز کرده و کدهای زیر را داخل فایل مینویسیم.

     class FTPClient
     {
           // *** Class variables
           public function __construct() { }
     }

نام کلاس ما FTPClient است.کدهای بالا برای کسانی که با برنامه نویسی شیء گرا آشنا هستند نیاز به توضیح ندارد.

با استفاده از کلمه کلیدی class یک کلاس ایجاد کردیم.داخل این کلاس یک تابع (متد) قرار دارد با نام __construct. این متد ، متد سازنده نام دارد.هنگامی که از کلاس FTPClient یک شیء ایجاد می کنیم این تابع به صورت خودکار اجرا میشود.

نکته : نام متد construct با دو زیرخط (underline) شروع میشود.

مرحله سوم : متغیرهای کلاس

در این مرحله متغیرهای مورد نیاز کلاس را ایجاد میکنیم.

private $connectionId;
private $loginOk = false;
private $messageArray = array();

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

$connectionId متغیری است که رشته اتصال را نگهداری میکند.

$loginOk هنگامی که اتصال ما به سرور موفقیت آمیز بود true میشود.

$messageArray آرایه ای که پیغام ها را نگهداری میکند.

مرحله چهارم : ذخیره سازی پیغام ها

در داخل هر متد ما متد logMessage را فراخوانی میکنیم.این متد وظیفه ذخیره پیغام های ایجاد شده به وسیله کلاس مارا دارد.بنابراین کاربر میتواند از روند اجرای کار در جریان قرار گیرد.

کدهای زیر را به کلاس FTPClient اضافه کنید :

     private function logMessage($message)
     {
          $this->messageArray[] = $message;
     }

به دلیل اینکه متغیر $messageArray یکی از اعضای کلاس است با استفاده از کلمه کلیدی $this-> به آن دسترسی پیدا میکنیم.

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

کدهای زیر را نیز به کلاس اضافه کنید :

     public function getMessages()
     {
          return $this->messageArray;
     }

همینطور که میبینید این متد یک متد public یا عمومی میباشد.کلمه کلیدی public مانند کلمه private نوع دسترسی به اجزاء کلاس را مشخص می کند. اجزائی که با کلمه کلیدی public مشخص می شوند در بیرون از کلاس نیز میتوان به آنها دسترسی داشت.

مرحله پنجم : اتصال به سرور

در این مرحله متد connect را در کلاس خواهیم نوشت. این متد برای اتصال به سرور به کار می آید :

public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false)
{
      // *** Set up basic connection
      $this->connectionId = ftp_connect($server);
      // *** Login with username and password
      $loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword);
      // *** Sets passive mode on/off (default off)
      ftp_pasv($this->connectionId, $isPassive);
      // *** Check connection
      if ((!$this->connectionId) || (!$loginResult)) {
            $this->logMessage('FTP connection has failed!');
            $this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true);
            return false;
      } else {
            $this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser);
            $this->loginOk = true;
            return true;
      }
}

ما اطلاعات مربوط به اتصال به سرور را به این متد ارسال کردیم.برای اتصال به سرور نام کاربری ($ftpUser) ، رمز عبور ($ftpPassword) و نام سرور ($server) نیاز خواهیم داشت.

اولین دستور یک اتصال FTP را ایجاد میکند.اطلاعات این اتصال را درمتغیر $connectionId ذخیره میکنیم.

دستور ftp_login برای ورود به سرور استفاده میشود.پارامتر اول اطلاعات سرورمورد نظر($connectionId) ، پارامتر دوم نام کاربری و پارامتر سوم این تابع رمز عبور برای ورود به سرور می باشد.

Passive Ftp  یک نوع امن تر انتقال اطلاعات در پروتکل FTP است.به هر حال با استفاده از دستور ftp_pasv میتوانید این قابلیت را فعال یا غیر فعال کنید.

سپس در دستور if از صحت اتصال به سرور با خبر میشویم.در هر صورت با استفاده از تابع logMessage نتیجه این اتصال را ذخیره میکنیم.

مرحله ششم : آزمایش اتصال

تا این مرحله از کار ما کلاسی نوشتیم که یک تابع برای اتصال به سرور دارد.برای آزمایش از عملکرد این کلاس کدهای زیر را به فایل index.php اضافه کنید.

// *** Define your host, username, and password
define('FTP_HOST', '192.168.1.88');
define('FTP_USER', 'Blimpf');
define('FTP_PASS', 'catfish');
// *** Include the class
include('ftp_class.php');
// *** Create the FTP object
$ftpObj = new FTPClient();
// *** Connect
$ftpObj -> connect(FTP_HOST, FTP_USER, FTP_PASS);

همینطور که در کدهای بالا میبینید ابتدا جزئیات مربوط به اتصال را اضافه کردیم.این تنظیمات همچنین میتوانند در فایلی جداگانه قرار گیرند.

سپس با استفاده از دستور include فایل ftp_class.php را به صفحه index.php وارد کردیم تا بتوانیم از کلاس FTPClient در فایل index.php استفاده کنیم.

در خط بعد با استفاده از کلمه کلیدی new یک شیء از کلاس FTPClient ساختیم و در متغیر $ftpObj قرار دادیم.

در انتها متد( تابع ) connect را از کلاس FTPClient فراخوانی کرده و نام سرور ، نام کاربری و رمزعبور را به این تابع ارسال کردیم.

مرحله ششم بخش دوم : مشاهده خروجی

در این مرحله کدهای قسمت قبل را کمی تغییر میدهیم.

// *** Connect
if ($ftpObj -> connect(FTP_HOST, FTP_USER, FTP_PASS)) {
      // *** Then add FTP code here
      echo 'connected';
} else {
      echo 'Failed to connect';
}

کدهای مرحله قبل را میتوانیم به وسیله یک شرط if چک کنیم.

در کلاس FTPClient دو تابع برای مدیریت پیغام ها ایجاد کردیم.در صورتی که اتصال با سرور با موفقیت انجام نشد میتوانیم از دستور زیر برای نمایش پیغام مورد نظر استفاده کنیم.

// *** Connect
if ($ftpObj -> connect(FTP_HOST, FTP_USER, FTP_PASS)) {
      // *** Then add FTP code here
      echo 'connected';
} else {
      print_r($ftpObj -> getMessages()); 
}

مرحله هفتم : ساخت پوشه (directory)

خیلی خب، الان زمانش رسیده است که توابع کاربردی را اضافه کنیم.اولین متدی که اضافه خواهیم کرد متد makeDir میباشد. این متد یک پوشه روی سرور میسازد. این متد یک پارامتر میگیرد که مسیر و نام پوشه مورد نظر است.قسمت مهم این متد ، تابع ftp_mkdir میباشد که دو پارامتر میگیرد.پارمتر اول رشته اتصال و پارامتر دوم مسیر و نام پوشه است.

کدهای زیر را به فایل ftp_class.php اضافه کنید:

public function makeDir($directory)
{
      // *** If creating a directory is successful...
      if (ftp_mkdir($this->connectionId, $directory))
      {
                      $this->logMessage('Directory "' . $directory . '" created  successfully');
            return true;
      } else {
            // *** ...Else, FAIL.
            $this->logMessage('Failed creating directory "' . $directory . '"');
            return false;
      }
}

حالا برای ساخت یک پوشه جدید به صورت زیر از این متد در فایل index.php استفاده میکنیم :

$dir = 'photos';  
 // *** Make directory  
$ftpObj->makeDir($dir);

مرحله هشتم : آپلود فایل

ادامه این بحث رو با اضافه کردن تابعی برای آپلود فایل روی سرور دنبال میکنیم.

زمانی که بخواهیم یک فایل را روی سرور آپلود کنیم نیاز داریم تا نوع فایل را تشخیص دهیم( باینری یا اسکی). به طور ساده درصورتی که یک فایل متنی را آپلود کنیم این فایل از نوع ascci و در بقیه موارد نوع فایل Binary خواهد بود.

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

$asciiArray = array(‘txt’,’csv’);

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

برای فهمیدن پسوند فایل از تابع explode استفاده میکنیم :

$extension = end(explode(‘.’ , $file));

در کد بالا ابتدا با تابع explode نام فایل را به آرایه تبدیل کردیم.سپس با دستور end  آخرین عضو آرایه را برگرداندیم.

متد زیر را به کلاس FTPClient اضافه کنید :

public function uploadFile ($fileFrom, $fileTo)
{
      // *** Set the transfer mode
      $asciiArray = array('txt', 'csv');
      $extension = end(explode('.', $fileFrom));
      if (in_array($extension, $asciiArray)) {
            $mode = FTP_ASCII;
      } else {
            $mode = FTP_BINARY;
      }
      // *** Upload the file
      $upload = ftp_put($this->connectionId, $fileTo, $fileFrom, $mode);
      // *** Check upload status
      if (!$upload) {
                  $this->logMessage('FTP upload has failed!');
                  return false;
            } else {
                  $this->logMessage('Uploaded "' . $fileFrom . '" as "' . $fileTo);
                  return true;
            }
}

پس از ذخیره کردن پسوند فایل در متغیر $extension با استفاده از دستور in_array چک کردیم که آیا پسوند فایل یکی از دو پسوند موجود در آرایه $ascciArray میباشد یا خیر. در صورتی که این شرط برقرار باشد ثابت FTP_ASSCI در متغیر $mode قرار میگیرد در غیر اینصورت ثابت FTP_BINARY در این متغیر قرار خواهد گرفت.

سپس با دستور ftp_put اقدام به انتقال فایل به سرور کردیم.اگر انتقال با موفقیت انجام نشود تابع uploadFile مقدار false را بر میگرداند.

برای استفاده از این متد در فایل index.php به صورت زیر عمل میکنیم :

$fileFrom = 'zoe.jpg';
$fileTo = $dir . '/' . $fileFrom;
// *** Upload local file to new directory on server
$ftpObj -> uploadFile($fileFrom, $fileTo);

مرحله نهم : تغییر مسیر

برای حرکت بین پوشه های ساخته شده متد زیر را به کلاس FTPClient اضافه میکنیم  :

public function changeDir($directory)
{
    if (ftp_chdir($this->connectionId, $directory))
    {
        $this->logMessage('Current directory is now:'.ftp_pwd($this->connectionId));
        return true;
      } else {
            $this->logMessage('Couldn\'t change directory');
            return false;
      }
}

در متد changeDir تنها تابعی که نیاز به توضیح دارد تابع ftp_chdir است.همینطور که متوجه شدید این تابع وظیفه تغییر مسیر را بر عهده دارد.

مرحله دهم : لیست فایلها

حال برای نمایش لیست فایلهای موجود روی سرور متد  getDirListing را به کلاس FTPClient اضافه میکنیم.این متد لیست فایلها و پوشه های سرور را به صورت یک آرایه بر میگرداند :

public function getDirListing($directory = '.', $parameters = '-la')
{
       // get contents of the current directory
       $contentsArray = ftp_nlist($this->connectionId, $parameters.'  '.$directory);
       return $contentsArray;
}

$directory : نام پوشه ایست که میخواهید لیست فایلهای آنرا ببینید.

$parameter : این پارامتر به صورت پیش فرض ‘-la’ را در خودش جای داده. ‘-la’ یک دستور لینوکس برای نمایش اطلاعات بیشتری در مورد دایرکتوری مورد نظر میدهد.

برای نمایش لیست فایلها در فایل index.php به صورت زیر عمل کنید :

echo ‘<pre>’;
print_r($ftpObj->getDirListing());
echo ‘</pre>’;

دانلود PDF این آموزش از لینک زیر :

آموزش کار با پروتکل FTP در PHP به صورت PDF

منبع : http://net.tutsplus.com/tutorials/php/how-to-work-with-php-and-ftp

بازدید : ۳۶۹۸

آذر ۳۰, ۱۳۹۱ @ ۱۱:۰۹ ق.ظ

خیلی خوب بود …. مرسی

پاسخ دادن
بهمن ۱۴, ۱۳۹۲ @ ۵:۱۶ ب.ظ

بابت مطالب خوبتون ممنون
http://ganjine-etelaat.ir/

پاسخ دادن
pouya
شهریور ۳۱, ۱۳۹۳ @ ۹:۱۳ ق.ظ

آقای مقدم زاده نمیدونم اصلا چطوری تشکر کنم از این همه لطف ، بدون هیچ چشمداشتی بهترین اطلاعات رو در اختیارمون میذارید، واقعا خسته نباشید، یه دنیا ممنون

پاسخ دادن
رضا
دی ۱۹, ۱۳۹۳ @ ۸:۱۰ ب.ظ

خیلی عالی بود
شدید استفاده کردم
ممنون

پاسخ دادن

پاسخ دهید

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


*