java实现ftp文件的上传与下载

先介绍个FTP工具,希望能提高工作效率~~

FTP客户端-IIS7服务器管理工具
作为FTP客户端,它支持批量管理ftp站点。定时上传和定时下载,定时备份,且操作简洁。同时iis7服务器管理工具还是vnc客户端。并且支持批量管理管理windows及linux服务器、vps。让服务器真正实现了一站式管理,真的是非常方便。
官网地址:http://fwqglgj.iis7.net/cp/ftp/?cmc-zc
使用截图如下:
 
 

 

然后,我们用程序自己来写。

最近在做ftp文件的上传与下载,基于此,整理了一下资料。本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的。。。

1.首先引用3个包

 

2.然后是相关类的代码

 1 /**
 2  * ftp链接常量
 3  *
 4  */
 5 public class Ftp {
 6 
 7     private String ipAddr;//ip地址
 8     
 9     private Integer port;//端口号
10     
11     private String userName;//用户名
12     
13     private String pwd;//密码
14     
15     private String path;//aaa路径
16 
17     public String getIpAddr() {
18         return ipAddr;
19     }
20 
21     public void setIpAddr(String ipAddr) {
22         this.ipAddr = ipAddr;
23     }
24 
25     public Integer getPort() {
26         return port;
27     }
28 
29     public void setPort(Integer port) {
30         this.port = port;
31     }
32 
33     public String getUserName() {
34         return userName;
35     }
36 
37     public void setUserName(String userName) {
38         this.userName = userName;
39     }
40 
41     public String getPwd() {
42         return pwd;
43     }
44 
45     public void setPwd(String pwd) {
46         this.pwd = pwd;
47     }
48 
49     public String getPath() {
50         return path;
51     }
52 
53     public void setPath(String path) {
54         this.path = path;
55     }
56     
57     
58 }

 

  1 import java.io.File;
  2 import java.io.FileInputStream;
  3 import java.io.FileOutputStream;
  4 import java.io.IOException;
  5 import java.io.OutputStream;
  6 
  7 
  8 import org.apache.commons.net.ftp.FTPClient;
  9 import org.apache.commons.net.ftp.FTPFile;
 10 import org.apache.commons.net.ftp.FTPReply;
 11 import org.apache.log4j.Logger;
 12 
 13 public class FtpUtil {
 14     
 15     private static Logger logger=Logger.getLogger(FtpUtil.class);
 16     
 17     private static FTPClient ftp;
 18     
 19     /**
 20      * 获取ftp连接
 21      * @param f
 22      * @return
 23      * @throws Exception
 24      */
 25     public static boolean connectFtp(Ftp f) throws Exception{
 26         ftp=new FTPClient();
 27         boolean flag=false;
 28         int reply;
 29         if (f.getPort()==null) {
 30             ftp.connect(f.getIpAddr(),21);
 31         }else{
 32             ftp.connect(f.getIpAddr(),f.getPort());
 33         }
 34         ftp.login(f.getUserName(), f.getPwd());
 35         ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
 36         reply = ftp.getReplyCode();      
 37         if (!FTPReply.isPositiveCompletion(reply)) {      
 38               ftp.disconnect();      
 39               return flag;      
 40         }      
 41         ftp.changeWorkingDirectory(f.getPath());      
 42         flag = true;      
 43         return flag;
 44     }
 45     
 46     /**
 47      * 关闭ftp连接
 48      */
 49     public static void closeFtp(){
 50         if (ftp!=null && ftp.isConnected()) {
 51             try {
 52                 ftp.logout();
 53                 ftp.disconnect();
 54             } catch (IOException e) {
 55                 e.printStackTrace();
 56             }
 57         }
 58     }
 59     
 60     /**
 61      * ftp上传文件
 62      * @param f
 63      * @throws Exception
 64      */
 65     public static void upload(File f) throws Exception{
 66         if (f.isDirectory()) {
 67             ftp.makeDirectory(f.getName());
 68             ftp.changeWorkingDirectory(f.getName());
 69             String[] files=f.list();
 70             for(String fstr : files){
 71                 File file1=new File(f.getPath()+"/"+fstr);
 72                 if (file1.isDirectory()) {
 73                     upload(file1);
 74                     ftp.changeToParentDirectory();
 75                 }else{
 76                     File file2=new File(f.getPath()+"/"+fstr);
 77                     FileInputStream input=new FileInputStream(file2);
 78                     ftp.storeFile(file2.getName(),input);
 79                     input.close();
 80                 }
 81             }
 82         }else{
 83             File file2=new File(f.getPath());
 84             FileInputStream input=new FileInputStream(file2);
 85             ftp.storeFile(file2.getName(),input);
 86             input.close();
 87         }
 88     }
 89     
 90     /**
 91      * 下载链接配置
 92      * @param f
 93      * @param localBaseDir 本地目录
 94      * @param remoteBaseDir 远程目录
 95      * @throws Exception
 96      */
 97     public static void startDown(Ftp f,String localBaseDir,String remoteBaseDir ) throws Exception{
 98         if (FtpUtil.connectFtp(f)) {
 99             
100             try { 
101                 FTPFile[] files = null; 
102                 boolean changedir = ftp.changeWorkingDirectory(remoteBaseDir); 
103                 if (changedir) { 
104                     ftp.setControlEncoding("GBK"); 
105                     files = ftp.listFiles(); 
106                     for (int i = 0; i < files.length; i++) { 
107                         try{ 
108                             downloadFile(files[i], localBaseDir, remoteBaseDir); 
109                         }catch(Exception e){ 
110                             logger.error(e); 
111                             logger.error("<"+files[i].getName()+">下载失败"); 
112                         } 
113                     } 
114                 } 
115             } catch (Exception e) { 
116                 logger.error(e); 
117                 logger.error("下载过程中出现异常"); 
118             } 
119         }else{
120             logger.error("链接失败!");
121         }
122         
123     }
124     
125     
126     /** 
127      * 
128      * 下载FTP文件 
129      * 当你需要下载FTP文件的时候,调用此方法 
130      * 根据<b>获取的文件名,本地地址,远程地址</b>进行下载 
131      * 
132      * @param ftpFile 
133      * @param relativeLocalPath 
134      * @param relativeRemotePath 
135      */ 
136     private  static void downloadFile(FTPFile ftpFile, String relativeLocalPath,String relativeRemotePath) { 
137         if (ftpFile.isFile()) {
138             if (ftpFile.getName().indexOf("?") == -1) { 
139                 OutputStream outputStream = null; 
140                 try { 
141                     File locaFile= new File(relativeLocalPath+ ftpFile.getName()); 
142                     //判断文件是否存在,存在则返回 
143                     if(locaFile.exists()){ 
144                         return; 
145                     }else{ 
146                         outputStream = new FileOutputStream(relativeLocalPath+ ftpFile.getName()); 
147                         ftp.retrieveFile(ftpFile.getName(), outputStream); 
148                         outputStream.flush(); 
149                         outputStream.close(); 
150                     } 
151                 } catch (Exception e) { 
152                     logger.error(e);
153                 } finally { 
154                     try { 
155                         if (outputStream != null){ 
156                             outputStream.close(); 
157                         }
158                     } catch (IOException e) { 
159                        logger.error("输出文件流异常"); 
160                     } 
161                 } 
162             } 
163         } else { 
164             String newlocalRelatePath = relativeLocalPath + ftpFile.getName(); 
165             String newRemote = new String(relativeRemotePath+ ftpFile.getName().toString()); 
166             File fl = new File(newlocalRelatePath); 
167             if (!fl.exists()) { 
168                 fl.mkdirs(); 
169             } 
170             try { 
171                 newlocalRelatePath = newlocalRelatePath + '/'; 
172                 newRemote = newRemote + "/"; 
173                 String currentWorkDir = ftpFile.getName().toString(); 
174                 boolean changedir = ftp.changeWorkingDirectory(currentWorkDir); 
175                 if (changedir) { 
176                     FTPFile[] files = null; 
177                     files = ftp.listFiles(); 
178                     for (int i = 0; i < files.length; i++) { 
179                         downloadFile(files[i], newlocalRelatePath, newRemote); 
180                     } 
181                 } 
182                 if (changedir){
183                     ftp.changeToParentDirectory(); 
184                 } 
185             } catch (Exception e) { 
186                 logger.error(e);
187             } 
188         } 
189     } 
190 
191     
192     public static void main(String[] args) throws Exception{  
193             Ftp f=new Ftp();
194             f.setIpAddr("1111");
195             f.setUserName("root");
196             f.setPwd("111111");
197             FtpUtil.connectFtp(f);
198             File file = new File("F:/test/com/test/Testng.java");  
199             FtpUtil.upload(file);//把文件上传在ftp上
200             FtpUtil.startDown(f, "e:/",  "/xxtest");//下载ftp文件测试
201             System.out.println("ok");
202           
203        }  
204     
205 }

以上代码均测试通过了。。。

 

 

 

 

 

项目及相关包下载:http://pan.baidu.com/s/1hq5p7NI

 

 

天天进步......天天更新

posted @ 2015-01-20 15:03  全力以赴001  阅读(74231)  评论(9编辑  收藏  举报