[教學]用PHP的FTP函式上傳檔案

前幾天 YOGO 看到知識+團員「程式油俠麥克雞」在一篇名為「PHP imagejpeg) 放入 FTP 怎麼做 」的發言,YOGO 覺得蠻好玩的,所以針對這篇內容跟各位朋友討論一下,不過為免這篇討論被原發問者「自行移除」,因為這種事在知識+常出現,所以 YOGO 把整篇討論的內容抓圖另存起來。(迷之聲:還真是無聊)

首先原提問者「皓哲」說到「他嘗試用imagejpeg()先把圖檔放在使用者電腦,在接著寫把圖檔從使用者電腦上傳到FTP,但都失敗」;這時「程式油俠麥克雞」回答說「imagejpeg有辦法將檔案寫入使用者電腦?這真是奇囉」,這時原提問者「皓哲」又回答說「@程式油俠麥克雞,這種回答也難怪你是知識貧民了」,後來「程式油俠麥克雞」又回應了他一些話,此時原提問者「皓哲」又回答說「@程式油俠麥克雞,你好幼稚」,二人的對話還蠻好玩的,有興趣了解的朋友可看一下原址出處或下方第一張和第二張圖,OK!故事說完了,現在開始進入主題了,YOGO 是一位十分富有研究精神的人(心虛中),不會因為「程式油俠麥克雞」是我的團員,我就偏坦他,所以我們就針對他們所爭論的爭議點開始研究吧。

01

02

首先我們針對原提問者「皓哲」所說的「他嘗試用imagejpeg()先把圖檔放在使用者電腦」這一點來討論,我們先到PHP官網看一下imagejpeg() 這個函式的使用說明http://tw.php.net/manual/en/function.imagejpeg.php;還有 PHP 官網也有提供使用相關範例,我們就趕快來試看看吧。

03

首先開啟你慣用的編輯器(在此YOGO 用的是 PSPad 這套軟體),並開啟一個新的PHP檔,然後輸入PHP官網所提供的範例,如下圖。

04

再來將檔案存成 index.php,並放到網站根資料夾底下,如下圖。

05

然後開啟慣用的瀏覽器(在此 YOGO 以 IE8 為例),然後在網址列的地方輸入http://localhost/index.php,然後可以看到如下圖的結果。

06

再來到「網站根目錄」底下,只有看到一個名為 index 的PHP檔,並無任何用 imagejpeg() 這個函式產生的圖片檔,也就是說官網範例一的輸出方式是透過串流檔傳送到瀏覽器上,並不會實際產生一個JPG檔。

07

 再來換試一下 PHP 官網的範例二,如下圖。

08

一樣將檔案存成 index.php,並放到網站根資料夾底下,如下圖。

09

一樣在網址列的地方輸入http://localhost/index.php,然後可以看到如下圖的結果,白白一片是正常的。

10

再來到「網站根目錄」底下,除了看到一個名為 index 的PHP檔外還有一個用 imagejpeg() 這個函式產生的JPG圖檔,也就是說官網範例二的輸出方式是在 SERVER(伺服器)端,實際產生一個JPG檔。

11

由此可知 imagejpeg() 這個函式的二種輸出方式,都無法在使用者端產生真實的JPG檔;如果原提問者「皓哲」所說的「他嘗試用imagejpeg()先把圖檔放在使用者電腦」中的「使用者電腦」,指的是伺服器的電腦的話,那就真的如「程式油俠麥克雞」所說的「老虎、老鼠,傻傻分不清楚,伺服器端與使用者端也分不清楚」,也如「程式油俠麥克雞」所說的「PHP 是伺服器端的程式語言,是不可能有能力把檔案寫到到使用者電腦」, 所以「程式油俠麥克雞」一開始回答的說法並沒有錯,也就是說「imagejpeg有辦法將檔案寫入使用者電腦?這真是奇囉」,這句話是對的,只是原提問者「皓哲」好像聽不懂「程式油俠麥克雞」在說什麼。

OK,再來我們繼續研究 PHP 中的 FTP 用法,所先開起一個新的 PHP 檔,然後輸入如下圖的程式碼。

12

一樣將檔案存成 index.php,並放到網站根資料夾底下,如下圖。

13

一樣在網址列的地方輸入http://localhost/index.php,如果可以看到如下圖的結果,就表示 PHP 中的 FTP 模組有啟用。

14

在此 YOGO 先說明一下,在原文討論中,「程式油俠麥克雞」說要確認 PHP 中的 FTP 模組是否有啟用,這部份是沒有錯,不過那是之前舊版的 PHP 中才需要額外加掛 FTP 模組,目前的 PHP 已將 FTP 模組納入標準函式庫內,所以無需再額外加掛 FTP 模組,不過這只限於 Windows 版的 PHP 才有,若你使用的是 Linux 版的 PHP ,編譯 PHP 時需一併將 FTP 模組編進去,這樣才能使用 PHP 的 FTP 模組。

由於 YOGO 是 Hinet 的用戶,所以擁有 Hinet 提供的 6oMB 網頁空間,而 Hinet 也有提供 FTP 檔案上傳,所以此次就以 Hinet 提供的免費空間來作 PHP 的 FTP 使用範例。

Hinet myWeb - 常見問題 - 網頁檔案如何上傳?

15

YOGO 首先用「FileZilla」連線到 Hint 提供的免費空間,並建立一個名為「test」的空資料夾,作為這次測試用的資料夾,如下圖。

16

再來的範例是融合 PHP 官網中的 imagejpeg 中的範例二與 ftp_put 範例一而成的,所以 YOGO 只講解重點部份,不會逐行講解,整體程式碼如下圖。

17

再來就是講解重點程式碼的時候了,第21行中的

ftp_connect ( string $host [, int $port = 21 [, int $timeout = 90 ]] )

是連接 FTP SERVER 的連接函式,這個函式有三個參數,除了第一個函式是必須參數之外,第二個跟第三個參數是非必需參數,其參數說明如下:

$host:要連接的 FTP SERVER 的位置,也就是上二張圖中所指的「主機位置」。
$port:要連接的 FTP SERVER 的Port號,也就是上二張圖中所指的「連接埠」。
$timeout:連線逾時時間,預設為90秒。

第24行中的

ftp_login ( resource $ftp_stream , string $username , string $password )

是登入 FTP SERVER 的登入函式,這個函式有三個參數,三個參數皆為必需參數,其參數說明如下:

$ftp_stream:要連接 FTP SERVER 的連線資源。
$username:登入 FTP SERVER 的帳號,也就是上二張圖中所指的「帳號」。
$password:登入 FTP SERVER 的密碼,也就是上二張圖中所指的「密碼」。

第27行中的

ftp_put ( resource $ftp_stream , string $remote_file , string $local_file , int $mode [, int $startpos = 0 ] )

是上傳檔案到 FTP SERVER 主機的上傳函式,這個函式更有五個參數,前四個參數是必須的,,其參數說明如下:

$ftp_stream:要連接 FTP SERVER 的連線資源。
$remote_file:要傳到遠端FTP SERVER 的檔案名稱。
$local_file:本地端要上傳的檔案名稱。
$mode:傳送模式,共有二種模式,分別為 FTP_ASCII(純文字模式)FTP_BINARY(二進位模式),特別說明一下,這個部份就如「程式油俠麥克雞」所說的,檔案傳輸有分模式,因為不同的作業系統對換行符號的定義同,所以需用 FTP_ASCII(純文字模式),自動處理不同作業系統間,換行符號不同的問題,若是上傳的檔案是圖檔或其他多媒體類的檔案的話,需用 FTP_BINARY(二進位模式)才行,因為 PHP 的 FTP 函式無法自動判斷檔案類型,所以需自行判斷上傳檔案的類型,去決定使用何種傳送模式,若改用
PEARFTP 模組就不用那麼麻煩,因為 PEARFTP 模組會自動去判斷何時該用何種傳送模式。

第34行中的

ftp_close ( resource $ftp_stream )

是關閉與 FTP SERVER 主機連線的函式,這個函式只有一個參數,且是必須的參數,,其參數說明如下:

$ftp_stream:要關閉連接 FTP SERVER 的連線資源。

一樣將檔案存成 index.php,並放到網站根資料夾底下,如下圖。

18

一樣在網址列的地方輸入http://localhost/index.php,如果可以看到如下圖的結果,就表示檔案已上傳到 Hinet 的免費空間上了。

19

YOGO 再次用「FileZilla」連線到 Hint 提供的免費空間,可以看到原本是空的test資料夾內,已有我們剛利用 PHP 的 FTP 函式上傳的圖檔,如下圖。

20

以上的實驗得到二個結果:

1.imagejpeg() 函式是無法在使用者的電腦存入任何檔案。
2.要利用 FTP函式上傳檔案,需依檔案類型選擇傳送模式。

其實「程式油俠麥克雞」說的沒錯,原提問者並沒有 PO 出完整的程式碼,且也沒有提供開發環境的說明,因為會造成 FTP 函式傳送失敗的原因很多,只要其中一個細節沒注意到就會無法成功上傳。

想不到 YOGO 真的變成好友小池說的「Y大師」了,剛連回知識+的原討論文章,想不到真的被原發問者「自行移除」,雖說這種事在知識+常出現,但 YOGO 還真的覺得可以去擺攤幫人算命了,當個「鐵口直斷Y大師」了。

21

如果覺得這篇文章對您有所幫助,在觀看完文章之餘,希望能點選下方方廣告,當作是對YOGO的支持,讓YOGO更有寫作的動力。

PS:下方延伸閱讀推薦的書中內容有對FTP模組應用的詳細範例與說明,有興趣的朋友可以參考看看。


延伸閱讀:

碼上就用PHP 5

內容簡介

本書提供各種問題的解決之道,不管您是需要驗證信用卡卡號?將網頁文字轉換成另一種語言?處理資料庫時遭遇神秘難解的問題?甚至打造自己的網頁伺服器?各種疑難雜症都可以在這本書裡頭找到可行的解決方案,並提供完整程式碼和詳細的解說。

本書在您的電腦桌旁可以扮演兩種角色。您可以把它當作解決問題的參考書。在撰寫程式的當中,如果您需要某個函式來幫您處理某些特定資料,您可以從本書取得那個函式,找到了答案,將它整個拿來用。您也可以把本書當做某種引導途徑,看看它提出的解決方法,然後利用所學到的知識做為指引來撰寫類似的程式。

本書並非設計讓您從頭讀到尾。您可以在任何時間隨時拿起它。不過PHP的初學者仍然會發現,挑選某些不熟悉的主題,將那些章節整個研讀一遍,這樣還是很有用處的。閱讀某些章節,看看裡面的內容,肯定能夠拓展您對特定主題的瞭解。

本書特色

*隨查即用,迅速解決您實務運作上的疑難雜症。
*提供完整程式碼和詳細的解說。
*每個章節均提供「快速提示」,初學者也能快速入門,掌握重點!

 

相關資訊:
http://www.books.com.tw/exep/assp.php/yogo/exep/prod/booksfile.php?item=0010356924

留言

這個網誌中的熱門文章

用PHP寄MAIL的方法

ImageMagick應用大全(一)

php安裝openssl的方法