FTP文件上傳下載

本文FTP鏈接的相關操做均在 被動模式 下進行。java

FTP的端口分兩種:控制端口數據端口git

鏈接FTP服務器時的port的默認21爲控制端口。程序員

FTP的數據端口顧名思義就是用來進行數據操做的端口。其又分爲兩種模式:主動模式被動模式github

主動模式端口默認爲20,被動模式端口爲範圍3000/4000。spring

當服務器上存在防火牆時,需注意開放相關端口的問題。服務器

完整示例代碼請見最後相關下載部分spring-boot

鏈接服務器並登陸

public FTPClient connect(String hostname, Integer port, String username, String password) throws IOException {
        // 建立鏈接
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(hostname, port);
        // 設置用於FTP控制鏈接的編碼:UTF-8等
        ftpClient.setControlEncoding(properties.getEncoding());
        log.error("windcoder.com:connect=>\t"+ftpClient.getReplyString());
        // 登陸服務器
        ftpClient.login(username, password);
        log.error("login=>\t"+ftpClient.getReplyString());
        return ftpClient;
    }複製代碼

退出並斷開鏈接

public void disconnect(FTPClient ftpClient) throws IOException {
        ftpClient.logout();
        log.error("disLogin=>\t"+ftpClient.getReplyString());
        ftpClient.disconnect();
        log.error("disConnect=>\t"+ftpClient.getReplyString());
    }複製代碼

獲取並下載文件關鍵代碼

// 進入文件所在遠程目錄
ftpClient.changeWorkingDirectory(remoteFilePath);
// 開啓被動模式
ftpClient.enterLocalPassiveMode();
// 設置以二進制方式傳輸
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 獲取文件,listFiles參數爲空時獲取當前目錄下全部文件,包含文件名時,可經過files.length == 1判斷是否存在該文件
FTPFile[] files =  ftpClient.listFiles(tmpFileName);
// 獲取文件大小
long remoteSize =  files[0].getSize();
//  返回一個用於讀取服務器上名爲tmpFileName的文件的InputStream,
InputStream in = ftpClient.retrieveFileStream(tmpFileName);
// 建立一個用於寫入localFile文件的輸出流,若需追加寫,則添加並將第二個參數設爲true。
FileOutputStream out = new FileOutputStream(localFile, true);
// 將in複製到out,具體方式可自由實現,這裏展現IOUtils方式
if (remoteSize - localSize >= 2 * FileUtils.ONE_GB) {
    // 文件大小超過2G時
    IOUtils.copyLarge(in, out);
}else {
    IOUtils.copy(in, out);
}
// 刷新此輸出流,並強制寫出全部緩衝的輸出字節。 flush的通常約定是,調用它代表,若是先前寫入的任何字節已由輸出流的實現緩衝,則應當即將這些字節寫入其預期的目標。
out.flush();
// 關閉相關流,這裏展現IOUtils方式
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
// 接收來自服務器的完成答覆並驗證整個事務是否成功
/**
 *  有些FTPClient方法不能完成整個FTP命令序列來完成事務。 這些命令要求程序員在收到確定的中間命令後採起一些措施。 
 *  程序員的代碼完成其操做後,必須調用此方法以接收來自服務器的完成答覆並驗證整個事務是否成功。
 * */
ftpClient.completePendingCommand();複製代碼

獲取並上傳文件關鍵代碼

// 建立輸入流
FileInputStream fis = new FileInputStream(filePath);
// 進入文件所在FTP遠程目錄
ftpClient.changeWorkingDirectory(uploadPath);
// 開啓被動模式
ftpClient.enterLocalPassiveMode();
// 調整ftp傳輸模式爲二進制方式
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 調用ftp的方法上載
// 從給定InputStream中獲取輸入並以給定文件名fileName將文件保存在FTP服務器上。
boolean ret = ftpClient.storeFile(fileName, fis);
// 關閉文件流
fis.close();複製代碼

參考資料

FtpConnection.javaui

本文首發 Windcoder編碼

相關文章
相關標籤/搜索