使用 FTPClient 上傳文件到 FTP Server,其他機器正常,唯獨本機生成 0 字節文件。經排查為 McAfee 防火牆攔截 FTP 數據連接端口 導致。
本案例中,Client 端 McAfee 防火牆阻擋了主動模式下 Server 回連的數據端口,導致命令握手成功但數據無法傳輸,生成 0 字節佔位文件。
FTPClient ftp = new FTPClient();
ftp.connect(host, port);
ftp.login(user, pass);
ftp.enterLocalPassiveMode(); // 強制被動模式,減少 Client 端防火牆干擾
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setBufferSize(1024 * 1024); // 1MB 緩衝區
// 上傳前檢查
if (!ftp.storeFile(remotePath, inputStream)) {
throw new IOException("FTP上傳失敗: " + ftp.getReplyString());
}
// 上傳後驗證
long remoteSize = ftp.getFileSize(remotePath);
if (remoteSize != localFile.length()) {
throw new IOException("文件大小不一致,疑似傳輸中斷");
}
| 檢查點 | 命令/操作 | 正常特徵 |
|---|---|---|
| 命令通道連通 | telnet ftp.host 21 | 返回 220 歡迎信息 |
| 數據通道連通 | 主動模式:Client netstat -an 看 LISTEN 端口 被動模式:Server 防火牆放行 PASV 端口範圍 | 數據傳輸時建立 ESTABLISHED 連接 |
| 防火牆日誌 | McAfee 日誌查看被阻擋的 TCP 連接 | 無 FTP 相關阻擋記錄 |
| 殺毒軟件掃描 | 實時掃描可能鎖定臨時文件 | 排除 FTP 臨時目錄 |
tcpdump/Wireshark 抓包分析 FTP 協議交互FTP 看似簡單,實則「雙通道、動態端口、防火牆敏感」三重坑疊加。遇到 0 字節文件,第一反應應是數據通道被阻斷,而非代碼邏輯錯誤。