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 host
101 * FTP服务器hostname
102 * @param port
103 * FTP服务器端口
104 * @param username
105 * FTP登录账号
106 * @param password
107 * FTP登录密码
108 * @param remotePath
109 * FTP服务器上的相对路径
110 * @param fileName
111 * 要下载的文件名
112 * @param localPath
113 * 下载后保存到本地的路径
114 * @return
115 * @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 }