FTP 上傳是 PHP 後端開發中高頻需求,無論是自動化部署、跨服務器文件同步,還是用戶素材收集,穩健的 FTP 客戶端封裝都不可或缺。本文提供一個生產級的完整示例,涵蓋連接認證、多級目錄遞歸創建、二進制上傳、本地臨時文件清理等核心環節,並針對權限配置給出關鍵提示。
function make_directory($ftp_stream, $dir) {
// 目錄已存在或可直接創建則返回成功
if ($this->ftp_is_dir($ftp_stream, $dir) || @ftp_mkdir($ftp_stream, $dir)) {
return true;
}
// 遞歸創建父目錄
if (!$this->make_directory($ftp_stream, dirname($dir))) {
return false;
}
// 最後創建當前目錄
return ftp_mkdir($ftp_stream, $dir);
}
function ftp_is_dir($ftp_stream, $dir) {
$original_directory = ftp_pwd($ftp_stream);
// 嘗試切換目錄,抑制錯誤輸出
if (@ftp_chdir($ftp_stream, $dir)) {
ftp_chdir($ftp_stream, $original_directory); // 切回原目錄
return true;
}
return false;
}
$conn = ftp_connect("ftp地址") or die("Could not connect");
ftp_login($conn, "ftpname", "password");
// 確保遠程目錄存在
make_directory($conn, $path);
ftp_chdir($conn, $path);
// 執行上傳(二進制模式)
if (ftp_put($conn, $info[0]['savename'], getcwd().$upload->savePath.$info[0]['savename'], FTP_BINARY)) {
// 上傳成功後刪除本地臨時文件
unlink(getcwd().$upload->savePath.$info[0]['savename']);
}
ftp_close($conn);
// 注意:需確保 FTP 賬號具備目標目錄的寫入/創建權限
@ 抑制 FTP 函數的警告,配合邏輯判斷實現靜默重試,避免中斷主流程。make_directory 採用「先嘗試創建,失敗則遞歸創建父目錄,再創建自身」的策略,完美解決多級嵌套目錄問題。ftp_close 釋放連接資源。生產環境建議增加:
① 連接超時與傳輸超時設置(ftp_set_option)
② 被動模式開關(ftp_pasv)以適應防火牆/NAT 環境
③ 上傳前 MD5 校驗、斷點續傳支持(需配合 ftp_nb_put 非阻塞模式)
④ 結構化異常處理替代 die(),便於上層業務捕獲錯誤碼