首頁  >  文章  >  後端開發  >  PHP的FTP學習(一)[轉自奧索]_PHP教程

PHP的FTP學習(一)[轉自奧索]_PHP教程

WBOY
WBOY原創
2016-07-21 16:10:11718瀏覽


By Vikram Vaswani
Melonfire
November 07, 2000
   我們是一群PHP的忠實FANS,我們因各種不同的原因使用它-WEB站點的開發,畫畫圖,數據庫的聯接等-我們發現,它非常的友好,強大而且易於使用……
你可能已經看到PHP是怎樣被用於創建GIF和JPEG圖像,從數據庫中動態的獲取信息等等,但這只是冰山的一角---最新版本的PHP擁有強大的檔案傳輸功能。
在這篇教學裡,我將向你展示FTP如何透過HTTP和FTP連結來傳輸文件,同時也會有一些簡單的程式碼,跟我來吧!

首先,你應該知道PHP是透過HTTP和FTP連結來傳輸檔案的。透過HTTP上傳檔案早在PHP3就已經出現,現在,新的FTP函數已經在新的PHP版本出現了!
開始之前,你需要確信你的PHP支援FTP,你可以透過以下程式碼查知:

--------------------- -------------------------------------------------- ---------


phpinfo();

?>
--------------- -------------------------------------------------- ---------------
檢查輸出結果,有一「Additional Modules」區,這裡列示了你的PHP支援的模組;如果你沒發現FTP模組,你最好重新安裝PHP,並新增FTP支援!

先讓我們來看看一個典型的FTP任務是怎麼完成的吧!
----------------------------------------------- ---------------------------------
$ ftp ftp.server.com
Connected to ftp. server.com
220 server.com FTP server ready.
Name (server:john): john
331 Password required for john.
Password:
230 User john logged in john logged in j.🎜 >Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for //lsl. -xr-x  5 john   users        3072 Nov  2 11:03 .
drwxr-x 
drwxr--r--   2 john   users        1024 Oct  5 13: 26 bin
drwx--x--x   8 john   users        1024 Nov  2 10:59 public_html
drwxr--r--   2 11:26 tmp
-rw-r-- r--   1 john   users     2941465 Oct  9 17:21 data.zip
226 Transfer complete.
ftp> bin
226 Transfer complete.
ftp> bin
226 Transfer complete.
ftp> bin
226 Transfer complete.
ftp> bin
0. : data.zip remote: data.zip
200 PORT command successful.
150 Opening BINARY mode data connection for data.zip(2941465 bytes).
226 Transfer complete. >221 Goodbye.
------------------------------------------- -------------------------------------
你可以看到,進程明顯被分成幾段:聯接(與FTP伺服器建立聯接)、驗證(確定使用者是否有權力進入系統)、傳輸(這裡包括列目錄,上傳或下載檔案)、取消聯接。

使用PHP來FTP的步驟
建立一個PHP的FTP連接必須遵守以下基本步驟:開啟一個聯結 - 發出認證訊息 - 使用PHP函數操縱目錄和傳輸檔案。
以下具體實現:
---------------------------------------- ----------------------------------------


// 聯接FTP服務器
$conn = ftp_connect("ftp.server.com");

// 使用username和password登錄
ftp_login($conn, "john", "doe ");

// 取得遠端系統類型
ftp_systype($conn);

// 列示檔
$filelist = ftp_nlist($conn, "." );

// 下載檔案
ftp_get($conn, "data.zip", "data.zip", FTP_BINARY);

// 關閉連接
ftp_quit( $conn);

?>
----------------------------------- ---------------------------------------------
讓我們一步步的來:
為了初結化一個FTP聯接,PHP提供了ftp_connect()這個函數,它使用主機名稱和連接埠作為參數。在上面的例子裡,主機名字為「ftp.server.com」;如果連接埠沒指定,PHP將會使用「21」作為預設埠來建立連結。
聯接成功後ftp_connect()傳回一個handle句柄;這個handle將會被以後使用的FTP函式使用。
----------------------------------------------- ---------------------------------


// connect to FTP server
$conn = ftp_connect("ftp.server.com");

?>
---------------------- -------------------------------------------------- --------
一旦建立聯接,使用ftp_login()傳送一個使用者名稱和使用者密碼。你可以看到,這個函數ftp_login()使用了ftp_connect()函數傳來的handle,以確定使用者名稱和密碼能被提交到正確的伺服器。
----------------------------------------------- ---------------------------------


// log in with username and password
ftp_login($conn, "john", "doe");

?>
-------------------- -------------------------------------------------- ----------
這時,你就能夠做你想做的事情了,具體在下一部分講:

做完你想做的事後,千萬要記住使用ftp_quit()函數關閉你的FTP連接

--------------------------------- -----------------------------------------------


// close connection
ftp_quit($conn);

?>
------------------ -------------------------------------------------- ------------
登入了FTP伺服器,PHP提供了一些函數,它們可以取得一些關於系統和檔案以及目錄的資訊。

ftp_pwd()
如果你想知道你目前所在的目錄時,你就要用到這個函數了。
----------------------------------------------- ---------------------------------


// get current location
$here = ftp_pwd($conn);

?>
---------------------------- -------------------------------------------------- --
萬一你需要知道伺服器端運作的是什麼系統呢?
ftp_systype()剛好提供給你這方面的資訊。
----------------------------------------------- ---------------------------------


// get system type
$server_os = ftp_systype($conn);

?>
---------------------------- -------------------------------------------------- --
關於被動模式(PASV)的開關,PHP也提供了這樣一個函數,它能打開或關閉PASV(1表示開)
-------------- -------------------------------------------------- ----------------


// turn PASV on
ftp_pasv($conn, 1);

? >
---------------------------------------------- ----------------------------------

現在,你已經知道你在“哪裡”和「誰」跟你在一起了吧,現在我們開始在目錄中逛逛--實現這項功能的是ftp_chdir()函數,它接受一個目錄名稱作為參數。
----------------------------------------------- ---------------------------------


// change directory to " public_html"
ftp_chdir($conn, "public_html");

?>
------------------------ -------------------------------------------------- ------
如果你想回到你剛才所在的目錄(父目錄),ftp_cdup()能幫你實現你的願望,這個函數能回到上一層目錄。
----------------------------------------------- ---------------------------------


// go up one level in the directory tree
ftp_cdup($conn);

?>
-------------------------- -------------------------------------------------- ----
你也能夠建立或移動一個目錄,這要使用ftp_mkdir()和ftp_rmdir()函數;注意:ftp_mkdir()建立成功的話,就會傳回新建立的目錄名稱。
----------------------------------------------- ---------------------------------


// make the directory " test"
ftp_mkdir($conn, "test");

// remove the directory "test"
ftp_rmdir($conn, "test");

?>
----------------------------------------------- ---------------------------------
建立一個FTP的目錄通常是傳輸檔案--- 那麼就讓我們開始吧!

先是上傳文件,ftp_put()函數能很好的勝任這一職責,它需要你指定一個本地文件名,上傳後的文件名以及傳輸的類型。比方說:如果你想上傳“abc.txt”這個文件,上傳後命名為“xyz.txt”,命令應該是這樣:
----------------- -------------------------------------------------- -------------


// upload
ftp_put($conn, "xyz.txt", "abc.txt", FTP_ASCII);

?>
--------------------------------------- -----------------------------------------
下載檔案:
PHP所提供的函數是ftp_get(),它也需要一個伺服器上檔名,下載後的檔名,以及傳輸型別作為參數,例如:伺服器端檔為his.zip,你要下載到本機,並命名為hers.zip,指令如下:
--------------------------------------- -----------------------------------------


// download
ftp_get($conn, "hers.zip", "his.zip", FTP_BINARY);

?>
----------- -------------------------------------------------- -------------------
PHP定義了兩種模式作為傳輸模式FTP_BINARY 和FTP_ASCII ,這兩種模式的使用請看上兩例,至於其詳細解釋,本文也不多說了,具體請參考相關書籍。




我該怎麼列示文件呢? (用DIR? :) )
PHP提供兩種方法:一種是簡單列示檔案名稱和目錄,另一種是詳細的列示檔案的大小,權限,創立時間等資訊。
第一種使用ftp_nlist()函數,第二種用ftp_rawlist().兩個函數都需要一個目錄名做為參數,都返回目錄列做為一個數組,數組的每一個元素相當於列表的一行。
----------------------------------------------- ---------------------------------


// obtain file listing
$filelist = ftp_nlist($conn, ".");

?>
------------------------ -------------------------------------------------- ------
你一定想知道文件的大小吧!別急,這裡有一個非常容易的函數ftp_size(),它會傳回你所指定的檔案的大小,使用BITES作為單位。要指出的是,如果它返回的是 “-1”的話,意味著這是一個目錄,在隨後的例子中,你將會看到這一功能的應用。
----------------------------------------------- ---------------------------------


// obtain file size of file "data.zip"
$filelist = ftp_size($conn, "data.zip");

?>

現在,我們已經接觸了PHP關於FTP的大量函數,但這只是函數,離我們的目標還遠遠不夠,要顯示出這些函數的真正力量,我們應該建立一個程序,這個程序能以WEB方式上傳,下載文件---這就是我們將要做的!

在我們進入程式碼前,我想告訴大家的是,這個例子僅僅只是為了向大家解釋PHP的各種FTP函數的使用,很多方面還不夠完善,比如說,錯誤分析等,至於你想應用到你自己的程式中,你應該進行一些修改!

程式包含以下幾個檔案:
index.html - 登入檔案

actions.php - 程式必要的FTP程式碼

include.php - 程式主介面,它顯示文件列表和控制按鈕。

讓我們從"index.html"開始吧:
------------------------------ --------------------------------------------------

























Server



User



Password





---------- -------------------------------------------------- --------------------
這是一個登入表單,有一個伺服器名稱、使用者名稱、密碼,輸入框。輸入的變數將會被存到$server, $username 和 $password 變數中,表單提交後,呼叫actions.php,它將初始化FTP聯結。

注意那個「hidden」 它傳給action.php一個變數$action ,值為CWD。


這是action.php檔案的原始碼:
----------------------------- -------------------------------------------------- -










//檢查表單傳來的數據,不全則報錯,要想程序完善的話,這裡應該有更全的輸入檢測功能
if (!$server
!$username
!$password)
{
echo "提交資料不全!";
}
else
{
// keep reading
}

?>



------------ -------------------------------------------------- ------------------


接下來是變數"actions". 程式允許以下的action:

"action= CWD"

改變工作目錄

"action=Delete"

刪除指定檔案

"action=Download"

下載指定檔案

"action=Upload"

上傳指定檔案

如果你仔細檢查檔案include.php,在裡麵包含一個HTML介面,你將會看到,它包括許多表單,每一個指向一個特定的功能,每個表單包含一個field(通常隱藏) ,當表單提交,相應的功能將被執行。

例如:按下“刪除”,"action=Delete"就被傳送給"actions.php"

為了操作這四個功能,actions.php中程式碼如下:
------------------------------------------------- -------------------------------

// action: 改變目錄
if ( $action == "CWD")
{
// 具體程式碼
}

// action: 刪除檔案
else if ($action == "Delete")
{
// 具體程式碼
}
// action: 下載檔案
else if ($action == "Download")
{
// 具體程式碼
}
// action: 上傳檔案
else if ($action == "Upload")
{
// 具體程式碼
}

?>
? >------------------------------------------------- -------------------------------
以上的具體程式碼將會實現指定的功能,並退出循環,它們都包含以下步驟:

--------------------------------------- -----------------------------------------
透過客製化的函數聯接並登入FTP伺服器
connect();

轉向適當的目錄

執行選擇的功能

刷新列表,以察看改變的結果

透過include("include.php"),顯示檔案清單和控制按鈕

關閉聯接
----------------------- -------------------------------------------------- -------
注意:
以下功能支援多檔案操作- 即"action=Delete" 和"action=Download" 它們使用FOR循環來實現。
變數$cdir 和 $here 將在每一階段即時更新。

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314331.htmlTechArticleBy Vikram Vaswani Melonfire November 07, 2000 我們是一群PHP的忠實FANS,我們因各種不同的原因使用它-WEB站點的開發,畫圖,資料庫的聯接等-我們發...
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn