Java对FTP进行上传下载删除操作的工具类

  1 import org.apache.commons.net.ftp.FTPClient;
  2 import org.apache.commons.net.ftp.FTPFile;
  3 import org.apache.commons.net.ftp.FTPReply;
  4 
  5 import java.io.*;
  6 import java.net.MalformedURLException;
  7 
  8 public class FtpUtils {
  9   // ftp服务器地址
 10   private String hostName;
 11   // ftp服务器端口号
 12   private Integer port;
 13   private String userName;
 14   // ftp登录密码
 15   private String password;
 16 
 17   private final FTPClient ftpClient = new FTPClient();
 18 
 19   /**
 20     * 初始化ftp服务器
 21     */
 22   public FtpUtils(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     * @param pathName ftp服务保存地址
 48     * @param fileName 上传到ftp的文件名
 49     * @param originfilename 待上传文件的名称(绝对地址) *
 50     * @return
 51     */
 52   public boolean uploadFile(String pathName, String fileName, String originfilename) {
 53     InputStream inputStream = null;
 54     try {
 55       inputStream = new FileInputStream(new File(originfilename));
 56     } catch (FileNotFoundException e) {
 57       e.printStackTrace();
 58     }
 59     return this.uploadFile(pathName, fileName, inputStream);
 60   }
 61 
 62   /**
 63     * 上传文件
 64     *
 65     * @param pathName ftp服务保存地址
 66     * @param fileName 上传到ftp的文件名
 67     * @param inputStream 输入文件流
 68     * @return
 69     */
 70   public boolean uploadFile(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     return flag;
 91   }
 92 
 93   // 改变目录路径
 94   public boolean changeWorkingDirectory(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     return flag;
107   }
108 
109   // 创建多层目录文件,如果有ftp服务器已存在该文件,则不创建,如果无,则创建
110   public boolean createDirecroty(String remote) throws IOException {
111     String directory = remote + "/";
112     // 如果远程目录不存在,则递归创建远程服务器目录
113     if (!directory.equalsIgnoreCase("/") && !changeWorkingDirectory(new String(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) throws IOException {
151     boolean flag = false;
152     ftpClient.changeWorkingDirectory(path);
153     FTPFile[] ftpFileArr = ftpClient.listFiles();
154     if (ftpFileArr.length > 0) {
155       flag = true;
156     }
157     return flag;
158   }
159 
160   // 创建目录
161   public boolean makeDirectory(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     return flag;
175   }
176 
177   /**
178     * 下载文件 *
179     *
180     * @param pathName FTP服务器文件目录 *
181     * @param fileName 文件名称 *
182     * @param localpath 下载后的文件路径 *
183     * @return
184     */
185   public boolean downloadFile(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 = new FileOutputStream(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     return flag;
217   }
218 
219   /**
220     * @return
221     * @description: 关闭相关流操作方法
222     * @exception:
223     * @date: 2019/6/17 15:50
224     * @version: 1.0
225     */
226   private void close(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     * @param pathName FTP服务器保存目录 *
254     * @param fileName 要删除的文件名称 *
255     * @return
256     */
257   public boolean deleteFile(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     return flag;
275   }
276 }
原文地址:https://www.cnblogs.com/1012hq/p/11195641.html