1 importorg.apache.commons.net.ftp.FTPClient;2 importorg.apache.commons.net.ftp.FTPFile;3 importorg.apache.commons.net.ftp.FTPReply;4
5 import java.io.*;6 importjava.net.MalformedURLException;7
8 public classFtpUtils {9 //ftp服务器地址
10 privateString hostName;11 //ftp服务器端口号
12 privateInteger port;13 privateString userName;14 //ftp登录密码
15 privateString password;16
17 private final FTPClient ftpClient = newFTPClient();18
19 /**
20 * 初始化ftp服务器21 */
22 publicFtpUtils(String hostName, Integer port, String userName, String password) {23 this.hostName =hostName;24 this.port =port;25 this.userName =userName;26 this.password =password;27 ftpClient.setControlEncoding("utf-8");28 try{29 System.out.println("connecting...ftp服务器:" + this.hostName + ":" + this.port);30 ftpClient.connect(hostName, port); //连接ftp服务器
31 ftpClient.login(userName, password); //登录ftp服务器
32 int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
33 if (!FTPReply.isPositiveCompletion(replyCode)) {34 System.out.println("connect failed...ftp服务器:" + this.hostName + ":" + this.port);35 }36 System.out.println("connect successfu...ftp服务器:" + this.hostName + ":" + this.port);37 } catch(MalformedURLException e) {38 e.printStackTrace();39 } catch(IOException e) {40 e.printStackTrace();41 }42 }43
44 /**
45 * 上传文件46 *47 *@parampathName ftp服务保存地址48 *@paramfileName 上传到ftp的文件名49 *@paramoriginfilename 待上传文件的名称(绝对地址) *50 *@return
51 */
52 public booleanuploadFile(String pathName, String fileName, String originfilename) {53 InputStream inputStream = null;54 try{55 inputStream = new FileInputStream(newFile(originfilename));56 } catch(FileNotFoundException e) {57 e.printStackTrace();58 }59 return this.uploadFile(pathName, fileName, inputStream);60 }61
62 /**
63 * 上传文件64 *65 *@parampathName ftp服务保存地址66 *@paramfileName 上传到ftp的文件名67 *@paraminputStream 输入文件流68 *@return
69 */
70 public booleanuploadFile(String pathName, String fileName, InputStream inputStream) {71 boolean flag = false;72 try{73 System.out.println("开始上传文件");74 //initFtpClient();
75 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);76 createDirecroty(pathName);77 ftpClient.makeDirectory(pathName);78 ftpClient.changeWorkingDirectory(pathName);79 ftpClient.storeFile(fileName, inputStream);80 inputStream.close();81 ftpClient.logout();82 flag = true;83 System.out.println("上传文件成功");84 } catch(Exception e) {85 System.out.println("上传文件失败");86 e.printStackTrace();87 } finally{88 this.close(ftpClient, null, inputStream);89 }90 returnflag;91 }92
93 //改变目录路径
94 public booleanchangeWorkingDirectory(String directory) {95 boolean flag = true;96 try{97 flag =ftpClient.changeWorkingDirectory(directory);98 if(flag) {99 System.out.println("进入文件夹" + directory + " 成功!");100 } else{101 System.out.println("进入文件夹" + directory + " 失败!开始创建文件夹");102 }103 } catch(IOException ioe) {104 ioe.printStackTrace();105 }106 returnflag;107 }108
109 //创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
110 public boolean createDirecroty(String remote) throwsIOException {111 String directory = remote + "/";112 //如果远程目录不存在,则递归创建远程服务器目录
113 if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(newString(directory))) {114 int start = 0;115 int end = 0;116 if (directory.startsWith("/")) {117 start = 1;118 } else{119 start = 0;120 }121 end = directory.indexOf("/", start);122 String path = "";123 String paths = "";124 while (true) {125 String subDirectory = new String(remote.substring(start, end).getBytes("GBK"), "iso-8859-1");126 path = path + "/" +subDirectory;127 if (!existFile(path)) {128 if(makeDirectory(subDirectory)) {129 changeWorkingDirectory(subDirectory);130 } else{131 System.out.println("创建目录[" + subDirectory + "]失败");132 changeWorkingDirectory(subDirectory);133 }134 } else{135 changeWorkingDirectory(subDirectory);136 }137 paths = paths + "/" +subDirectory;138 start = end + 1;139 end = directory.indexOf("/", start);140 //检查所有目录是否创建完毕
141 if (end <=start) {142 break;143 }144 }145 }146 return true;147 }148
149 //判断ftp服务器文件是否存在
150 public boolean existFile(String path) throwsIOException {151 boolean flag = false;152 ftpClient.changeWorkingDirectory(path);153 FTPFile[] ftpFileArr =ftpClient.listFiles();154 if (ftpFileArr.length > 0) {155 flag = true;156 }157 returnflag;158 }159
160 //创建目录
161 public booleanmakeDirectory(String dir) {162 boolean flag = true;163 try{164 flag =ftpClient.makeDirectory(dir);165 if(flag) {166 System.out.println("创建文件夹" + dir + " 成功!");167
168 } else{169 System.out.println("创建文件夹" + dir + " 失败!");170 }171 } catch(Exception e) {172 e.printStackTrace();173 }174 returnflag;175 }176
177 /**
178 * 下载文件 *179 *180 *@parampathName FTP服务器文件目录 *181 *@paramfileName 文件名称 *182 *@paramlocalpath 下载后的文件路径 *183 *@return
184 */
185 public booleandownloadFile(String pathName, String fileName, String localpath) {186 boolean flag = false;187 OutputStream os = null;188 try{189 System.out.println("开始下载文件");190 //initFtpClient();191 //切换FTP目录
192 ftpClient.changeWorkingDirectory(pathName);193 FTPFile[] ftpFiles =ftpClient.listFiles();194 for(FTPFile file : ftpFiles) {195 if(fileName.equalsIgnoreCase(file.getName())) {196 //如果该目录下有同名文件,则执行删除操作.
197 if (new File(localpath + "/" +file.getName()).exists()) {198 new File(localpath + "/" +file.getName()).delete();199 }200
201 File localFile = new File(localpath + "/" +file.getName());202 os = newFileOutputStream(localFile);203 ftpClient.retrieveFile(file.getName(), os);204 os.close();205 }206 }207 ftpClient.logout();208 flag = true;209 System.out.println("下载文件成功");210 } catch(Exception e) {211 System.out.println("下载文件失败");212 e.printStackTrace();213 } finally{214
215 }216 returnflag;217 }218
219 /**
220 *@return
221 * @description: 关闭相关流操作方法222 *@exception:223 * @date: 2019/6/17 15:50224 *@version: 1.0225 */
226 private voidclose(FTPClient ftpClient, OutputStream out, InputStream in) {227 if(ftpClient.isConnected()) {228 try{229 ftpClient.disconnect();230 } catch(IOException e) {231 e.printStackTrace();232 }233 }234 if (null !=out) {235 try{236 out.close();237 } catch(IOException e) {238 e.printStackTrace();239 }240 }241 if (null !=in) {242 try{243 in.close();244 } catch(IOException e) {245 e.printStackTrace();246 }247 }248 }249
250 /**
251 * 删除文件 *252 *253 *@parampathName FTP服务器保存目录 *254 *@paramfileName 要删除的文件名称 *255 *@return
256 */
257 public booleandeleteFile(String pathName, String fileName) {258 boolean flag = false;259 try{260 System.out.println("开始删除文件");261 //initFtpClient();262 //切换FTP目录
263 ftpClient.changeWorkingDirectory(pathName);264 ftpClient.dele(fileName);265 ftpClient.logout();266 flag = true;267 System.out.println("删除文件成功");268 } catch(Exception e) {269 System.out.println("删除文件失败");270 e.printStackTrace();271 } finally{272 this.close(ftpClient, null, null);273 }274 returnflag;275 }276 }