基本流程
ftp_connect() 建立連線
ftp_login() 驗證帳密
ftp_put() 上傳檔案(FTP_BINARY 或 FTP_ASCII)
ftp_close() 關閉連線
完整程式碼
<?php
$ftp_server = "ftp.example.com";
$ftp_user = "username";
$ftp_pass = "password";
// 連線
$conn = @ftp_connect($ftp_server) or die("無法連線至 $ftp_server");
$login = @ftp_login($conn, $ftp_user, $ftp_pass);
if (!$login) die("FTP 登入失敗:帳號或密碼錯誤");
echo "已連線:$ftp_server<br>";
// 上傳
$localFile = "/var/www/data/" . date("Ymd") . ".xml"; // 來源檔
$remoteFile = "/backup/" . basename($localFile); // 目的路徑
if (@ftp_put($conn, $remoteFile, $localFile, FTP_BINARY)) {
echo "上傳成功:$localFile → $remoteFile<br>";
} else {
echo "上傳失敗<br>";
}
ftp_close($conn);
?>
進階技巧
- 被動模式:
ftp_pasv($conn, true)(預設主動模式常被防火牆阻擋)。
- 錯誤處理: 用
ftp_get_option($conn, FTP_TIMEOUT_SEC) 設定逾時,搭配 @ 抑制警告並自行判斷回傳值。
- 斷點續傳:
ftp_nb_put() 非阻塞上傳,配合迴圈實作大檔案斷點續傳。
- 目錄操作:
ftp_mkdir(), ftp_chdir(), ftp_nlist() 列目錄。
- SSL/TLS (FTPS): 改用
ftp_ssl_connect()(需 PHP 編譯支援 OpenSSL)。
常見問題
| 現象 | 解決 |
| 連線逾時 | 檢查防火牆、FTP Server 是否開啟被動模式埠範圍、啟用 ftp_pasv() |
| 登入失敗 | 確認帳密、主動/被動模式、IP 白名單、TLS 強制加密 |
| 上傳 0 位元組 | 本地檔案不存在、路徑錯誤、權限不足 |
| 中文檔名亂碼 | FTP 協定不支援 Unicode,建議上傳前以英文/時間戳命名,或用 rawurlencode() 並確認 Server 支援 UTF-8 |