1 package com.jf.utils;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.io.IOException;
7 import java.io.OutputStream;
8
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 public class FtpUtils {
15 //private static FTPClient ftpclient = null;
16 private static String ip = PropertiesUtils.props.get("ip").toString();
17 private static String userName = PropertiesUtils.props.get("userName").toString();
18 private static String passWord = PropertiesUtils.props.get("passWord").toString();
19 private static ThreadLocal<FTPClient> ftpClientThreadLocal = new ThreadLocal<FTPClient>();
20 //static{
21 //ftpclient = getFtpClient(ip, userName, passWord);
22 //}
23 public static FTPClient getFtpClient() {
24 if(ftpClientThreadLocal.get() != null && ftpClientThreadLocal.get().isConnected()){
25 return ftpClientThreadLocal.get();
26 }else{
27 FTPClient ftpClient = new FTPClient();
28 // 传输的字符编码(防乱码)
29 ftpClient.setControlEncoding("UTF-8");
30 // 超时时间(防止FTP僵死)
31 ftpClient.setConnectTimeout(1000 * 60);
32 ftpClient.setDataTimeout(1000 * 60);
33 ftpClient.setDefaultTimeout(1000 * 60);
34 // 工作流的大小
35 ftpClient.setBufferSize(1024 * 4);
36 // 主被动模式(应对FTP服务器的相关安全设置)
37 // ftpclient.enterLocalPassiveMode();
38 ftpClient.enterLocalActiveMode();
39 @SuppressWarnings("unused")
40 FTPFile[] ftpFiles = null;
41 // 设置连接ip
42 try {
43 ftpClient.connect(ip);
44 // 连接是否正常
45 if (ftpClient.isConnected()) {
46 // 使用用户名和密码进行登录
47 if (ftpClient.login(userName, passWord)) {
48 // 判断FTP连接是否可用、源码中判断ReplyCode值为(reply >= 200) && (reply <
49 // 300)为可用,非单纯200!
50 if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
51 System.out.println("FTP登录成功,FTP IP:"+ ftpClient.getRemoteAddress());
52 setFileType(ftpClient);
53 }
54 }
55 }
56 } catch (Exception e) {
57 e.printStackTrace();
58 }
59 return ftpClient;
60 }
61 }
62
63 /**
64 * 设置文件类型
65 * @param ftpClient
66 */
67 @SuppressWarnings("static-access")
68 public static void setFileType(FTPClient ftpClient){
69 try {
70 // 默认为ASCII(value:0),此处设置为2进制
71 System.out.println("设置文件类型为:"+ ftpClient.BINARY_FILE_TYPE);
72 ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
73 ftpClient.changeWorkingDirectory("/");
74 } catch (IOException e1) {
75 e1.printStackTrace();
76 }
77 }
78
79 /**
80 * 断开FTP连接
81 */
82 public static void disconnect(){
83 try {
84 FTPClient ftpClient = getFtpClient();
85 ftpClient.logout();
86 if(ftpClient.isConnected()){
87 ftpClient.disconnect();
88 ftpClient = null;
89 }
90 } catch (IOException e) {
91 e.printStackTrace();
92 }
93 }
94
95 /**
96 * 上传
97 * @param client
98 * @param file 上传的文件
99 * @param uploadPath 服务器路径
100 * @return
101 */
102 public static boolean upload(File file,String serverPath) {
103 FTPClient ftpClient = getFtpClient();
104 // 上传文件到FTP服务器
105 // 扫描本地文件
106 // 获取当前目录下的所有文件
107 FileInputStream fis = null;
108 String name = null;
109 boolean sto = true;
110 try {
111 ftpClient.changeWorkingDirectory(serverPath);
112 name = file.getName();
113 System.out.println("上传本地文件:" + name);
114 fis = new FileInputStream(file.getPath());
115 sto = ftpClient.storeFile(name, fis);
116 } catch (Exception e) {
117 e.printStackTrace();
118 sto = false;
119 }finally{
120 }
121 if(sto)
122 System.out.println("上传" + name + "成功");
123 else
124 System.out.println("上传" + name + "失败");
125 return sto;
126 }
127
128 /**
129 * 下载
130 * @param client
131 * @param filename 下载的文件名
132 * @param serverPath 下载文件的路径
133 * @param localPath 保存到本地的路径
134 * @return
135 */
136 public static boolean download(String filename,String serverPath,String localPath){
137 FTPClient ftpClient = getFtpClient();
138 boolean ret = true;
139 try {
140 ftpClient.changeWorkingDirectory(serverPath);
141 OutputStream os = null;
142 System.out.println("下载FTP文件:" + filename);
143 os = new FileOutputStream(localPath + "/"+ filename);
144 ret = ftpClient.retrieveFile(filename, os);
145 } catch (Exception e) {
146 e.printStackTrace();
147 ret = false;
148 }
149 if(ret)
150 System.out.println("下载" + filename + "成功");
151 else
152 System.out.println("下载" + filename + "失败");
153 return ret;
154 }
155
156 /**
157 * 删除
158 * @param filename 文件名
159 * @param serverPath 文件的服务器路径
160 * @return
161 */
162 public static boolean delete(String filename,String serverPath){
163 FTPClient ftpClient = getFtpClient();
164 boolean del = true;
165 try {
166 ftpClient.changeWorkingDirectory(serverPath);
167 del = ftpClient.deleteFile(filename);
168 } catch (Exception e) {
169 e.printStackTrace();
170 del = false;
171 }
172 if(del)
173 System.out.println("删除" + filename + "成功");
174 else
175 System.out.println("删除" + filename + "失败");
176 return del;
177 }
178
179 /**
180 * 判断本地文件是否存在
181 * @param filePath 文件路径 以“/”结尾
182 * @param fileName 文件名
183 * @return
184 */
185 public static boolean judgeFile(String filePath,String fileName){
186 File file = new File(filePath + fileName);
187 return file.exists();
188 }
189
190 /**
191 * 判断FTP服务器上的文件是否存在 0为不存在,-1为异常
192 * @param fileServerPath 文件的服务器路径
193 * @param fileName 文件名
194 * @return
195 */
196 public static int judgeServerFile(String fileServerPath,String fileName){
197 FTPClient ftpClient = getFtpClient();
198 int num = -1;
199 try {
200 ftpClient.changeWorkingDirectory(fileServerPath);
201 FTPFile[] ftpFiles = ftpClient.listFiles(fileName);
202 num = ftpFiles.length;
203 } catch (IOException e) {
204 e.printStackTrace();
205 }
206 return num;
207 }
208
209 public static void main(String[] args) {
210 //File file = new File("D://ftp_test.txt");
211 //上传
212 //FtpUtils.upload(file, "/test");
213 //下载
214 FtpUtils.download("ftp","/xxx/","D://aaa");
215 //删除
216 //FtpUtils.delete("ftp_test.txt","/test");
217 //System.out.println(FtpUtils.judgeFile("D://aaa/", "ftp_test.txt"));
218 }
219 }