انجمن عمومی گسترش فناوری آگو
مدیریت فایلها در PHP قسمت سوم : پروتکل FTP - نسخه‌ی قابل چاپ

+- انجمن عمومی گسترش فناوری آگو (http://forums.ago.ir)
+-- انجمن: انجمن های عمومی گسترش فناوری آگو (/forumdisplay.php?fid=1)
+--- انجمن: برنامه نویسی (/forumdisplay.php?fid=13)
+--- موضوع: مدیریت فایلها در PHP قسمت سوم : پروتکل FTP (/showthread.php?tid=2280)



مدیریت فایلها در PHP قسمت سوم : پروتکل FTP - agotd - 01-09-2014 04:19 PM

بعد از مدت زیادی غیبت دوباره برگشتم. اولا از دوستان به خاطر تاخیر در گذاشتن مطلب و پاسخ به سوالات عذرخواهی میکنم.در ادامه میتونید آموزش کار با پروتکل 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 را باز کرده و کدهای زیر را داخل فایل مینویسیم.


کد php:
بعد از مدت زیادی غیبت دوباره برگشتماولا از دوستان به خاطر تاخیر در گذاشتن مطلب و پاسخ به سوالات عذرخواهی میکنم.در ادامه میتونید آموزش کار با پروتکل 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 را باز کرده و کدهای زیر را داخل فایل مینویسیم

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

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

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

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

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

کد php:
private $connectionId;
private 
$loginOk false;
private 
$messageArray = array(); 

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

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

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

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

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

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

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

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

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

کد php:
public function getMessages()
     {
          return 
$this->messageArray;
     } 

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

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

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

کد php:
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 ' $ftpUsertrue);
            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 اضافه کنید.

کد 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_HOSTFTP_USERFTP_PASS); 

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

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

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

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

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

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

کد php:
// *** Connect
if ($ftpObj -> connect(FTP_HOSTFTP_USERFTP_PASS)) {
      
// *** Then add FTP code here
      
echo 'connected';
} else {
      echo 
'Failed to connect';


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

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

کد php:
// *** Connect
if ($ftpObj -> connect(FTP_HOSTFTP_USERFTP_PASS)) {
      
// *** Then add FTP code here
      
echo 'connected';
} else {
      
print_r($ftpObj -> getMessages()); 


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

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

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

کد 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 استفاده میکنیم :

کد php:
$dir 'photos';  
 
// *** Make directory  
$ftpObj->makeDir($dir); 

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

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

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

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

کد php:
$asciiArray = array(‘txt’,’csv’); 

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

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

کد php:
$extension end(explode(.’ $file)); 

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

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

کد php:
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 به صورت زیر عمل میکنیم :

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

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

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

کد php:
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 اضافه میکنیم.این متد لیست فایلها و پوشه های سرور را به صورت یک آرایه بر میگرداند :

کد php:
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 به صورت زیر عمل کنید :

کد php:
echo <pre>;
print_r($ftpObj->getDirListing());
echo 
</pre>