1 package com.xxx.common.util; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import org.apache.commons.net.ftp.FTP; 9 import org.apache.commons.net.ftp.FTPClient; 10 import org.apache.commons.net.ftp.FTPFile; 11 import org.apache.commons.net.ftp.FTPReply; 12 13 /** 14 * ftp上传下载工具类 15 */ 16 public class FTPUtil { 17 18 /** 19 * Description: 向FTP服务器上传文件 20 * 21 * @param host 22 * FTP服务器hostname 23 * @param port 24 * FTP服务器端口 25 * @param username 26 * FTP登录账号 27 * @param password 28 * FTP登录密码 29 * @param basePath 30 * FTP服务器基础目录 31 * @param filePath 32 * FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath 33 * @param filename 34 * 上传到FTP服务器上的文件名 35 * @param input 36 * 输入流 37 * @return 成功返回true,否则返回false 38 * @throws Exception 39 */ 40 public static boolean uploadFile(String host, int port, String username, String password, String basePath, 41 String filePath, String filename, InputStream input) throws Exception { 42 boolean result = false; 43 FTPClient ftp = new FTPClient(); 44 try { 45 int reply; 46 ftp.connect(host, port);// 连接FTP服务器 47 // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器 48 ftp.login(username, password);// 登录 49 reply = ftp.getReplyCode(); 50 if (!FTPReply.isPositiveCompletion(reply)) { 51 ftp.disconnect(); 52 return result; 53 } 54 // 切换到上传目录 55 if (!ftp.changeWorkingDirectory(basePath + filePath)) { 56 // 如果目录不存在创建目录 57 String[] dirs = filePath.split("/"); 58 String tempPath = basePath; 59 for (String dir : dirs) { 60 if (null == dir || "".equals(dir)) 61 continue; 62 tempPath += "/" + dir; 63 if (!ftp.changeWorkingDirectory(tempPath)) { 64 if (!ftp.makeDirectory(tempPath)) { 65 return result; 66 } else { 67 ftp.changeWorkingDirectory(tempPath); 68 } 69 } 70 } 71 } 72 // 设置上传文件的类型为二进制类型 73 ftp.setFileType(FTP.BINARY_FILE_TYPE); 74 // 上传文件 75 if (!ftp.storeFile(filename, input)) { 76 return result; 77 } 78 input.close(); 79 // 退出 80 ftp.logout(); 81 result = true; 82 } catch (IOException e) { 83 e.printStackTrace(); 84 throw new Exception(e); 85 } finally { 86 if (ftp.isConnected()) { 87 try { 88 ftp.disconnect(); 89 } catch (IOException ioe) { 90 ioe.printStackTrace(); 91 } 92 } 93 } 94 return result; 95 } 96 97 /** 98 * Description: 从FTP服务器下载文件 99 * 100 * @param host101 * FTP服务器hostname102 * @param port103 * FTP服务器端口104 * @param username105 * FTP登录账号106 * @param password107 * FTP登录密码108 * @param remotePath109 * FTP服务器上的相对路径110 * @param fileName111 * 要下载的文件名112 * @param localPath113 * 下载后保存到本地的路径114 * @return115 * @throws Exception 116 */117 public static boolean downloadFile(String host, int port, String username, String password, String remotePath,118 String fileName, String localPath) throws Exception {119 boolean result = false;120 FTPClient ftp = new FTPClient();121 try {122 int reply;123 ftp.connect(host, port);124 // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器125 ftp.login(username, password);// 登录126 reply = ftp.getReplyCode();127 if (!FTPReply.isPositiveCompletion(reply)) {128 ftp.disconnect();129 return result;130 }131 ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录132 FTPFile[] fs = ftp.listFiles();133 for (FTPFile ff : fs) {134 if (ff.getName().equals(fileName)) {135 File localFile = new File(localPath + "/" + ff.getName());136 137 OutputStream is = new FileOutputStream(localFile);138 ftp.retrieveFile(ff.getName(), is);139 is.close();140 }141 }142 143 ftp.logout();144 result = true;145 } catch (IOException e) {146 e.printStackTrace();147 throw new Exception(e);148 } finally {149 if (ftp.isConnected()) {150 try {151 ftp.disconnect();152 } catch (IOException ioe) {153 ioe.printStackTrace();154 }155 }156 }157 return result;158 }159 }