1.FTP文件的上傳與下載(注意是單個文件的上傳與下載)
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 實現FTP文件上傳和文件下載 */ public class FtpApche { private static FTPClient ftpClient = new FTPClient(); private static String encoding = System.getProperty("file.encoding"); /** * Description: 向FTP服務器上傳文件 * * @Version1.0 * @param url * FTP服務器hostname * @param port * FTP服務器端口 * @param username * FTP登錄賬號 * @param password * FTP登錄密碼 * @param path * FTP服務器保存目錄,如果是根目錄則為“/” * @param filename * 上傳到FTP服務器上的文件名 * @param input * 本地文件輸入流 * @return 成功返回true,否則返回false */ public static boolean uploadFile(String url, int port, String username, String password, String path, String filename, InputStream input) { boolean result = false; try { int reply; // 如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器 ftpClient.connect(url); // ftp.connect(url, port);// 連接FTP服務器 // 登錄 ftpClient.login(username, password); ftpClient.setControlEncoding(encoding); // 檢驗是否連接成功 reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { System.out.println("連接失敗"); ftpClient.disconnect(); return result; } // 轉移工作目錄至指定目錄下 boolean change = ftpClient.changeWorkingDirectory(path); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); if (change) { result = ftpClient.storeFile(new String(filename.getBytes(encoding),"iso-8859-1"), input); if (result) { System.out.println("上傳成功!"); } } input.close(); ftpClient.logout(); } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; } /** * 將本地文件上傳到FTP服務器上 * */ public void testUpLoadFromDisk() { try { FileInputStream in = new FileInputStream(new File("D:/test02/list.txt")); boolean flag = uploadFile("10.0.0.102", 21, "admin","123456", "/", "lis.txt", in); System.out.println(flag); } catch (FileNotFoundException e) { e.printStackTrace(); } } /** * Description: 從FTP服務器下載文件 * * @Version1.0 * @param url * FTP服務器hostname * @param port * FTP服務器端口 * @param username * FTP登錄賬號 * @param password * FTP登錄密碼 * @param remotePath * FTP服務器上的相對路徑 * @param fileName * 要下載的文件名 * @param localPath * 下載后保存到本地的路徑 * @return */ public static boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath) { boolean result = false; try { int reply; ftpClient.setControlEncoding(encoding); /* * 為了上傳和下載中文文件,有些地方建議使用以下兩句代替 * new String(remotePath.getBytes(encoding),"iso-8859-1")轉碼。 * 經過測試,通不過。 */ // FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT); // conf.setServerLanguageCode("zh"); ftpClient.connect(url, port); // 如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器 ftpClient.login(username, password);// 登錄 // 設置文件傳輸類型為二進制 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 獲取ftp登錄應答代碼 reply = ftpClient.getReplyCode(); // 驗證是否登陸成功 if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP server refused connection."); return result; } // 轉移到FTP服務器目錄至指定的目錄下 ftpClient.changeWorkingDirectory(new String(remotePath.getBytes(encoding),"iso-8859-1")); // 獲取文件列表 FTPFile[] fs = ftpClient.listFiles(); for (FTPFile ff : fs) { if (ff.getName().equals(fileName)) { File localFile = new File(localPath + "/" + ff.getName()); OutputStream is = new FileOutputStream(localFile); ftpClient.retrieveFile(ff.getName(), is); is.close(); } } ftpClient.logout(); result = true; } catch (IOException e) { e.printStackTrace(); } finally { if (ftpClient.isConnected()) { try { ftpClient.disconnect(); } catch (IOException ioe) { } } } return result; } /** * 將FTP服務器上文件下載到本地 * */ public void testDownFile() { try { boolean flag = downFile("10.0.0.102", 21, "admin", "123456", "/", "ip.txt", "E:/"); System.out.println(flag); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { FtpApche fa = new FtpApche(); fa.testDownFile(); fa.testUpLoadFromDisk(); } }
2.FTP文件夾的上傳與下載(注意是整個文件夾)
package ftp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.TimeZone; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; import org.apache.log4j.Logger; public class FTPTest_04 { private FTPClient ftpClient; private String strIp; private int intPort; private String user; private String password; private static Logger logger = Logger.getLogger(FTPTest_04.class.getName()); /* * * Ftp構造函數 */ public FTPTest_04(String strIp, int intPort, String user, String Password) { this.strIp = strIp; this.intPort = intPort; this.user = user; this.password = Password; this.ftpClient = new FTPClient(); } /** * @return 判斷是否登入成功 * */ public boolean ftpLogin() { boolean isLogin = false; FTPClientConfig ftpClientConfig = new FTPClientConfig(); ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID()); this.ftpClient.setControlEncoding("GBK"); this.ftpClient.configure(ftpClientConfig); try { if (this.intPort > 0) { this.ftpClient.connect(this.strIp, this.intPort); }else { this.ftpClient.connect(this.strIp); } // FTP服務器連接回答 int reply = this.ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { this.ftpClient.disconnect(); logger.error("登錄FTP服務失敗!"); return isLogin; } this.ftpClient.login(this.user, this.password); // 設置傳輸協議 this.ftpClient.enterLocalPassiveMode(); this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); logger.info("恭喜" + this.user + "成功登陸FTP服務器"); isLogin = true; }catch (Exception e) { e.printStackTrace(); logger.error(this.user + "登錄FTP服務失敗!" + e.getMessage()); } this.ftpClient.setBufferSize(1024 * 2); this.ftpClient.setDataTimeout(30 * 1000); return isLogin; } /** * @退出關閉服務器鏈接 * */ public void ftpLogOut() { if (null != this.ftpClient && this.ftpClient.isConnected()) { try { boolean reuslt = this.ftpClient.logout();// 退出FTP服務器 if (reuslt) { logger.info("成功退出服務器"); } }catch (IOException e) { e.printStackTrace(); logger.warn("退出FTP服務器異常!" + e.getMessage()); }finally { try { this.ftpClient.disconnect();// 關閉FTP服務器的連接 }catch (IOException e) { e.printStackTrace(); logger.warn("關閉FTP服務器的連接異常!"); } } } } /*** * 上傳Ftp文件 * @param localFile 當地文件 * @param romotUpLoadePath上傳服務器路徑 - 應該以/結束 * */ public boolean uploadFile(File localFile, String romotUpLoadePath) { BufferedInputStream inStream = null; boolean success = false; try { this.ftpClient.changeWorkingDirectory(romotUpLoadePath);// 改變工作路徑 inStream = new BufferedInputStream(new FileInputStream(localFile)); logger.info(localFile.getName() + "開始上傳....."); success = this.ftpClient.storeFile(localFile.getName(), inStream); if (success == true) { logger.info(localFile.getName() + "上傳成功"); return success; } }catch (FileNotFoundException e) { e.printStackTrace(); logger.error(localFile + "未找到"); }catch (IOException e) { e.printStackTrace(); }finally { if (inStream != null) { try { inStream.close(); }catch (IOException e) { e.printStackTrace(); } } } return success; } /*** * 下載文件 * @param remoteFileName 待下載文件名稱 * @param localDires 下載到當地那個路徑下 * @param remoteDownLoadPath remoteFileName所在的路徑 * */ public boolean downloadFile(String remoteFileName, String localDires, String remoteDownLoadPath) { String strFilePath = localDires + remoteFileName; BufferedOutputStream outStream = null; boolean success = false; try { this.ftpClient.changeWorkingDirectory(remoteDownLoadPath); outStream = new BufferedOutputStream(new FileOutputStream( strFilePath)); logger.info(remoteFileName + "開始下載...."); success = this.ftpClient.retrieveFile(remoteFileName, outStream); if (success == true) { logger.info(remoteFileName + "成功下載到" + strFilePath); return success; } }catch (Exception e) { e.printStackTrace(); logger.error(remoteFileName + "下載失敗"); }finally { if (null != outStream) { try { outStream.flush(); outStream.close(); }catch (IOException e) { e.printStackTrace(); } } } if (success == false) { logger.error(remoteFileName + "下載失敗!!!"); } return success; } /*** * @上傳文件夾 * @param localDirectory * 當地文件夾 * @param remoteDirectoryPath * Ftp 服務器路徑 以目錄"/"結束 * */ public boolean uploadDirectory(String localDirectory, String remoteDirectoryPath) { File src = new File(localDirectory); try { remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/"; boolean makeDirFlag = this.ftpClient.makeDirectory(remoteDirectoryPath); System.out.println("localDirectory : " + localDirectory); System.out.println("remoteDirectoryPath : " + remoteDirectoryPath); System.out.println("src.getName() : " + src.getName()); System.out.println("remoteDirectoryPath : " + remoteDirectoryPath); System.out.println("makeDirFlag : " + makeDirFlag); // ftpClient.listDirectories(); }catch (IOException e) { e.printStackTrace(); logger.info(remoteDirectoryPath + "目錄創建失敗"); } File[] allFile = src.listFiles(); for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (!allFile[currentFile].isDirectory()) { String srcName = allFile[currentFile].getPath().toString(); uploadFile(new File(srcName), remoteDirectoryPath); } } for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (allFile[currentFile].isDirectory()) { // 遞歸 uploadDirectory(allFile[currentFile].getPath().toString(), remoteDirectoryPath); } } return true; } /*** * @下載文件夾 * @param localDirectoryPath本地地址 * @param remoteDirectory 遠程文件夾 * */ public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) { try { String fileName = new File(remoteDirectory).getName(); localDirectoryPath = localDirectoryPath + fileName + "//"; new File(localDirectoryPath).mkdirs(); FTPFile[] allFile = this.ftpClient.listFiles(remoteDirectory); for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (!allFile[currentFile].isDirectory()) { downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory); } } for (int currentFile = 0;currentFile < allFile.length;currentFile++) { if (allFile[currentFile].isDirectory()) { String strremoteDirectoryPath = remoteDirectory + "/"+ allFile[currentFile].getName(); downLoadDirectory(localDirectoryPath,strremoteDirectoryPath); } } }catch (IOException e) { e.printStackTrace(); logger.info("下載文件夾失敗"); return false; } return true; } // FtpClient的Set 和 Get 函數 public FTPClient getFtpClient() { return ftpClient; } public void setFtpClient(FTPClient ftpClient) { this.ftpClient = ftpClient; } public static void main(String[] args) throws IOException { FTPTest_04 ftp=new FTPTest_04("10.0.0.102",21,"admin","123456"); ftp.ftpLogin(); System.out.println("1"); //上傳文件夾 boolean uploadFlag = ftp.uploadDirectory("D:\\test02", "/"); //如果是admin/那么傳的就是所有文件,如果只是/那么就是傳文件夾 System.out.println("uploadFlag : " + uploadFlag); //下載文件夾 ftp.downLoadDirectory("d:\\tm", "/"); ftp.ftpLogOut(); } }