Java_FTP服務下載工具類
阿新 • • 發佈:2019-02-03
/** * */ package com.sinosoft.common.ftp; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.SocketException; 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; import common.Logger; public class FtpCollectionUtil { private String username; private String password; private String ftpHostName; private int port = 21; private FTPClient ftpClient = new FTPClient(); private FileOutputStream fos = null; private Logger logger = Logger.getLogger(FtpCollectionUtil.class); private static String encoding = System.getProperty("file.encoding"); public FtpCollectionUtil(String username, String password, String ftpHostName, int port) { super(); this.username = username; this.password = password; this.ftpHostName = ftpHostName; this.port = port; } /** * 建立連線 */ private void connect() { try { logger.debug("開始連線"); // 連線 ftpClient.connect(ftpHostName, port); int reply = ftpClient.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); } // 登入 ftpClient.login(username, password); ftpClient.setBufferSize(256); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // ftpClient.setControlEncoding("utf8"); logger.debug("登入成功!"); logger.debug("開始登入!"); } catch (SocketException e) { logger.error("", e); } catch (IOException e) { logger.error("", e); } } /** * 關閉輸入輸出流 * * @param fos */ private void close(FileOutputStream fos) { try { if (fos != null) { fos.close(); } ftpClient.logout(); logger.info("退出登入"); ftpClient.disconnect(); logger.info("關閉連線"); } catch (IOException e) { logger.error("", e); } } /** * 下載檔案 * * @param ftpFileName * @param localDir */ public boolean down(String ftpFileName, String localDir) { connect(); return downFileOrDir(ftpFileName, localDir); } private boolean downFileOrDir(String ftpFileName, String localDir) { boolean result = false; try { File file = new File(new String(ftpFileName.getBytes("iso-8859-1"), "GBK")); File temp = new File(localDir); if (!temp.exists()) { temp.mkdirs(); } FTPFile[] listFiles = ftpClient.listFiles(ftpFileName); if(listFiles.length > 0){ // 判斷是否是目錄 if (isDir(ftpFileName)) { String[] names = ftpClient.listNames(); for (int i = 0; i < names.length; i++) { System.out.println(names[i] + "^^^^^^^^^^^^^^"); if (isDir(names[i])) { downFileOrDir(ftpFileName + '/' + names[i], localDir + File.separator + names[i]); ftpClient.changeToParentDirectory(); } else { File localfile = new File(localDir + File.separator + names[i]); if (!localfile.exists()) { fos = new FileOutputStream(localfile); ftpClient.retrieveFile(names[i], fos); } else { logger.debug("開始刪除檔案"); file.delete(); logger.debug("檔案已經刪除"); fos = new FileOutputStream(localfile); ftpClient.retrieveFile(ftpFileName, fos); } } } } else { File localfile = new File(localDir + File.separator + file.getName()); if (!localfile.exists()) { fos = new FileOutputStream(localfile); ftpClient.retrieveFile(ftpFileName, fos); } else { logger.debug("開始刪除檔案"); file.delete(); logger.debug("檔案已經刪除"); fos = new FileOutputStream(localfile); ftpClient.retrieveFile(ftpFileName, fos); } ftpClient.changeToParentDirectory(); } result = true; logger.info("下載成功!"); }else{ result = false; logger.info("目標檔案不存在!"); } } catch (SocketException e) { logger.error("連線失敗!", e); return result; } catch (IOException e) { logger.error("下載失敗!", e); return result; }finally{ close(fos); } return result; } // 判斷是否是目錄 public boolean isDir(String fileName) { try { // 切換目錄,若當前是目錄則返回true,否則返回true。 boolean falg = ftpClient.changeWorkingDirectory(fileName); return falg; } catch (Exception e) { e.printStackTrace(); logger.error("", e); } return false; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFtpHostName() { return ftpHostName; } public void setFtpHostName(String ftpHostName) { this.ftpHostName = ftpHostName; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public static void main(String[] args) { // FtpCollectionUtil ftpUtil = new FtpCollectionUtil("ftpuser", // "sinosoftftp", "127.0.0.1", 21); // ftpUtil.down("/"+URLEncoder.encode("旬月雨量")+"/", "D://a"); try { // String fileName = new String("/新建資料夾/".getBytes(encoding), "iso-8859-1"); // System.out.println(fileName); System.out.println(ftpUtil.down(new String("/旬月雨量/5月降水.bmp".getBytes("GBK"), "iso-8859-1"), "D://a"));//英文可以下載 System.out.println("encoding : " + encoding); // ftpUtil.down(URLEncoder.encode("/新建資料夾/"), "D://a");//中文可以下載 // ftpUtil.down(fileName, "D://a"); } catch (Exception e) { e.printStackTrace(); } } }