文件交互場景下,FTP 仍是穩定可靠的選擇。本文封裝 commons-net-3.3.jar,提供生產級工具類 FavFTPUtil,支援斷點續傳式上傳、自定義遠端文件名、目錄自動創建、異常安全關閉連接,並經 2GB 大文件實測無重命名失敗問題。
| 方法 | 用途 | 特色 |
|---|---|---|
uploadFile(..., InputStream) | 流式上傳 | 適配 Controller 層 MultipartFile |
uploadFileFromProduction(..., originFilename, remoteName) | 本地文件上傳並重命名 | 指定遠端文件名 |
uploadFileFromProduction(..., originFilename) | 本地文件上傳保持原名 | 自動提取文件名 |
deleteFile(..., remoteName) | 刪除遠端文件 | 切換目錄後刪除 |
downloadFile(..., localPath) | 下載到本地 | 忽略大小寫匹配文件名 |
// 統一連接邏輯
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
ftpClient.connect(hostname, port);
ftpClient.login(username, password);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) return false;
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.makeDirectory(pathname);
ftpClient.changeWorkingDirectory(pathname);
ftpClient.storeFile(fileName, inputStream); // 上傳核心
// ... finally 確保斷開連接
public class FavFTPTest extends TestCase {
public void testFavFTPUtil() {
String hostname = "127.0.0.1", username = "business", password = "business";
String pathname = "business/ebook", filename = "big.rar";
String origin = "C:\\Users\\Downloads\\Downloads.rar";
FavFTPUtil.uploadFileFromProduction(hostname, 21, username, password, pathname, filename, origin);
// FavFTPUtil.downloadFile(hostname, 21, username, password, pathname, filename, "D:/");
}
}
GenericObjectPool 復用 FTPClient,降低握手開銷。setConnectTimeout(5000)、setDataTimeout(30000) 防止掛死。ftpClient.enterLocalPassiveMode() 適配防火牆/NAT 環境。完整代碼已整理為獨立模組,引入即用,顯著降低文件服務集成成本。