PHP中使用FTP的方法,這邊分享一些常用的FTP操作,如連線、上傳、下載、列出檔案、刪除檔案、建立目錄、刪除目錄等。

FTP 連線

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ftp_server = ""; // FTP Server IP
$ftp_user = ""; // FTP User
$ftp_pass = ''; // FTP Password

// 連線
$conn_id = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");

// 登入
if (ftp_login($conn_id, $ftp_user, $ftp_pass)) {
echo "Connected as $ftp_user@$ftp_server\n";
} else {
echo "Could not connect as $ftp_user\n";
}

ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10); // 設定超時時間(秒)(看需求設定)
ftp_pasv($conn_id, true); // 開啟被動模式(true: 被動, false: 主動)

這邊要特別說明什麼是被動模式主動模式

主動模式 (Active Mode)

傳輸過程:
客戶端(PHP 程式)發送連接請求到 FTP 伺服器的 21 號控制端口。
連接建立後,伺服器從它自己的 20 號端口向客戶端的指定端口發起資料連接。

防火牆影響:
主動模式需要客戶端的防火牆允許外部主動連接。
因為伺服器需要連接到客戶端的隨機端口,所以客戶端的防火牆通常必須開啟相應的端口範圍,否則可能會被防火牆阻擋。

被動模式 (Passive Mode)

傳輸過程:
客戶端(PHP 程式)仍然先連接到 FTP 伺服器的 21 號控制端口。
伺服器開啟一個隨機的高位端口,並通知客戶端使用此端口進行資料傳輸。
客戶端主動連接到伺服器指定的高位端口來完成資料傳輸。

防火牆影響:
被動模式更適合用在防火牆後的客戶端,因為客戶端主動連接到伺服器。
大部分客戶端防火牆允許被動模式的操作,因此這種模式通常在網絡限制較多的環境下更穩定。

什麼時候選用主動或被動模式?

主動模式:適合沒有防火牆限制的環境,且能更快地進行傳輸。
被動模式:適合客戶端在防火牆後方或網絡限制較多的情境,通常更為通用穩定。

FTP 上傳

1
2
3
4
5
6
7
8
9
$local_file = 'local.txt'; // 本地端檔案
$remote_file = 'remote.txt'; // 遠端檔案

// 上傳
if (ftp_put($conn_id, $remote_file, $local_file, FTP_ASCII)) {
echo "Successfully uploaded $local_file\n";
} else {
echo "There was a problem while uploading $local_file\n";
}

FTP 下載

1
2
3
4
5
6
7
8
9
10

$local_file = 'local.txt'; // 本地端檔案
$remote_file = 'remote.txt'; // 遠端檔案

// 下載
if (ftp_get($conn_id, $local_file, $remote_file, FTP_ASCII)) {
echo "Successfully downloaded $remote_file\n";
} else {
echo "There was a problem while downloading $remote_file\n";
}

FTP 列出檔案(僅能列出當前目錄(單層))

1
2
3
4
$files = ftp_nlist($conn_id, ".");
foreach ($files as $file) {
echo $file . "\n";
}

FTP 刪除檔案

1
2
3
4
5
6
7
8
$remote_file = 'remote.txt'; // 遠端檔案

// 刪除
if (ftp_delete($conn_id, $remote_file)) {
echo "Successfully deleted $remote_file\n";
} else {
echo "There was a problem while deleting $remote_file\n";
}

FTP 建立目錄

1
2
3
4
5
6
7
8
$dir = 'test'; // 目錄名稱

// 建立目錄
if (ftp_mkdir($conn_id, $dir)) {
echo "Successfully created $dir\n";
} else {
echo "There was a problem while creating $dir\n";
}

FTP 刪除目錄

1
2
3
4
5
6
7
8
$dir = 'test'; // 目錄名稱

// 刪除目錄
if (ftp_rmdir($conn_id, $dir)) {
echo "Successfully deleted $dir\n";
} else {
echo "There was a problem while deleting $dir\n";
}

FTP 關閉連線

1
ftp_close($conn_id);