Java 实现ftp文件的上传和下载

  import java.io.File;
import java.io.DataInputStream;
import java.io.OutputStream;    
import java.io.FileOutputStream;    
import java.io.FileInputStream;
import java.io.IOException;
 
import java.util.ArrayList;  
import java.util.Date;  
import java.util.List;  
import java.util.StringTokenizer;

import sun.net.TelnetInputStream;     
import sun.net.TelnetOutputStream; 
import sun.net.ftp.FtpClient; 

public class FtpUD{ 
    private String ip = "";
    private String username = "";   
    private String password = "";   
    private int port = -1;     
    private String path = "";          
   
    FtpClient ftpClient = null;   
          
    OutputStream os = null;          
    FileInputStream is = null;

    /**
      *构造函数
      * @param serverIP 服务器地址 
      * @param port     端口号 
      * @param username 登陆用户 
      * @param password 密码
     
    */        
    public FtpUD(String serverIP, int port, String username, String password,String path) {     
        this.ip = serverIP;     
        this.username = username;     
        this.password = password;     
        this.port = port;  
        this.path= path;  
    }  
   
    /**   
     * 连接ftp服务器   
     *    
     * @throws IOException   
     */    
    public boolean connectServer(){     
        ftpClient = new FtpClient();     
        try {     
              if(this.port != -1){     
                    ftpClient.openServer(this.ip,this.port);     
              }else{     
                    ftpClient.openServer(this.ip);     
              }   
             
              ftpClient.login(this.username, this.password);
                
              if (this.path.length() != 0){     
                    ftpClient.cd(this.path);    // path是ftp服务下主目录的子目录                
              }     
           
              ftpClient.binary();// 用2进制上传、下载     
              System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");     
              return true;     
        }catch (IOException e){     
              e.printStackTrace();     
              return false;     
        }     
    }     
         
    /**   
     * 断开与ftp服务器连接   
     *    
     * @throws IOException   
     */    
    public boolean closeServer(){     
        try{     
            if (is != null) {     
                is.close();     
            }     
            if (os != null) {     
                os.close();     
            }     
            if (ftpClient != null) {     
                ftpClient.closeServer();     
            }     
            System.out.println("已从服务器断开");     
            return true;     
        }catch(IOException e){     
            e.printStackTrace();     
            return false;     
        }     
    }     
         
    /**   
     * 检查文件夹在当前目录下是否存在   
     * @param dir   
     * @return   
     */    
     private boolean isDirExist(String dir){     
         String pwd = "";     
         try {     
             pwd = ftpClient.pwd();     
             ftpClient.cd(dir);     
             ftpClient.cd(pwd);     
         }catch(Exception e){     
             return false;     
         }     
         return true;      
     }     
   
     /**   
     * 在当前目录下创建文件夹   
     * @param dir   
     * @return   
     * @throws Exception   
     */    
     private boolean createDir(String dir){     
         try{     
            ftpClient.ascii();     
            StringTokenizer s = new StringTokenizer(dir, "/"); //sign     
            s.countTokens();     
            String pathName = ftpClient.pwd();     
           
            while(s.hasMoreElements()){     
                pathName = pathName + "/" + (String) s.nextElement();     
                try {     
                    ftpClient.sendServer("MKD " + pathName + "\r\n");     
                } catch (Exception e) {     
                    e = null;     
                    return false;     
                }     
                ftpClient.readServerResponse();     
            }     
            ftpClient.binary();     
            return true;     
        }catch (IOException e1){     
            e1.printStackTrace();     
            return false;     
        }     
     }     
        
        
     /**   
     * 取得相对于当前连接目录的某个目录下所有文件列表   
     *    
     * @param path   
     * @return   
     */    
    public List getFileList(String path){     
        List list = new ArrayList();     
        DataInputStream dis;     
        try {     
            dis = new DataInputStream(ftpClient.nameList(this.path + path));     
            String filename = "";     
            while((filename = dis.readLine()) != null){     
                list.add(filename);     
            }     
        } catch (IOException e) {     
            e.printStackTrace();     
        }     
        return list;     
    }   
     
   
     /**   
      * ftp上传   
      * 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换   
      *    
      * @param filename 要上传的文件(或文件夹)名   
      * @return   
      * @throws Exception   
      */    
    public boolean upload(String filename){     
        String newname = "";     
        if(filename.indexOf("/") > -1){     
            newname = filename.substring(filename.lastIndexOf("/") + 1);     
        }else{     
            newname = filename;     
        }     
        return upload(filename, newname);     
    }     
          
     /**   
      * ftp上传   
      * 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换   
      *    
      * @param fileName 要上传的文件(或文件夹)名   
      * @param newName 服务器段要生成的文件(或文件夹)名   
      * @return   
      */    
     public boolean upload(String fileName, String newName){     
         try{     
             String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");      
             File file_in = new File(savefilename);//打开本地待上传的文件     
             if(!file_in.exists()){     
                 throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");     
             }     
             if(file_in.isDirectory()){     
                 upload(file_in.getPath(),newName,ftpClient.pwd());     
             }else{     
                 uploadFile(file_in.getPath(),newName);     
             }     
                  
             if(is != null){     
                 is.close();     
             }     
             if(os != null){     
                 os.close();     
             }     
             return true;     
         }catch(Exception e){      
                e.printStackTrace();      
                System.err.println("Exception e in Ftp upload(): " + e.toString());      
                return false;     
         }finally{     
             try{     
                 if(is != null){     
                     is.close();     
                 }     
                 if(os != null){      
                     os.close();      
                 }     
             }catch(IOException e){     
                 e.printStackTrace();     
            }      
         }     
     }     
          
     /**   
      * 真正用于上传的方法   
      * @param fileName   
      * @param newName   
      * @param path   
      * @throws Exception   
      */    
     private void upload(String fileName, String newName,String path) throws Exception{     
             String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");      
             File file_in = new File(savefilename);//打开本地待上传的文件     
             if(!file_in.exists()){     
                 throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");     
             }     
             if(file_in.isDirectory()){     
                 if(!isDirExist(newName)){     
                     createDir(newName);     
                 }     
                 ftpClient.cd(newName);     
                 File sourceFile[] = file_in.listFiles();     
                 for(int i = 0; i < sourceFile.length; i++){     
                     if(!sourceFile[i].exists()){     
                         continue;     
                     }     
                     if(sourceFile[i].isDirectory()){     
                         this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName);     
                     }else{     
                         this.uploadFile(sourceFile[i].getPath(),sourceFile[i].getName());     
                      }     
                    }     
             }else{     
                 uploadFile(file_in.getPath(),newName);     
             }     
             ftpClient.cd(path);     
     }     
    
    /**   
     *  upload 上传文件   
     *    
     * @param filename 要上传的文件名   
     * @param newname 上传后的新文件名   
     * @return -1 文件不存在 >=0 成功上传,返回文件的大小   
     * @throws Exception   
     */    
    public long uploadFile(String filename, String newname) throws Exception{     
        long result = 0;     
        TelnetOutputStream os = null;     
        FileInputStream is = null;     
        try {     
            java.io.File file_in = new java.io.File(filename);     
            if(!file_in.exists())     
                return -1;     
            os = ftpClient.put(newname);     
            result = file_in.length();     
            is = new FileInputStream(file_in);     
            byte[] bytes = new byte[1024];     
            int c;     
            while((c = is.read(bytes)) != -1){     
                os.write(bytes, 0, c);     
            }     
        }finally{     
            if(is != null){     
                is.close();     
            }     
            if(os != null){     
                os.close();     
            }     
        }     
        return result;     
    }     
   
   
    /**   
     * 从ftp下载文件到本地   
     *    
     * @param filename 服务器上的文件名   
     * @param newfilename 本地生成的文件名   
     * @return   
     * @throws Exception   
     */    
    public long downloadFile(String filename, String newfilename){     
        long result = 0;     
        TelnetInputStream is = null;     
        FileOutputStream os = null;     
        try{     
            is = ftpClient.get(filename);     
            java.io.File outfile = new java.io.File(newfilename);     
            os = new FileOutputStream(outfile);     
            byte[] bytes = new byte[1024];     
            int c;     
            while ((c = is.read(bytes)) != -1) {     
                os.write(bytes, 0, c);     
                result = result + c;     
            }     
        }catch (IOException e){     
            e.printStackTrace();     
        }finally{     
            try {     
                if(is != null){     
                        is.close();     
                }     
                if(os != null){     
                    os.close();     
                }     
            } catch (IOException e) {     
                e.printStackTrace();     
            }     
        }     
        return result;     
    } 
   
   
          
    public static void main(String[] args) throws Exception {     
       FtpUD ftp = new FtpUD("FTP ip地址",-1,"用户名","密码","");   
            try {  
        ftp.connectServer();          
        
        //上传          
        /**
        boolean result = ftp.upload("E:/javaWP/Ttt", "lsxy911");     
        System.out.println(result?"上传成功!":"上传失败!");       
       
        List list = ");     
        for(int i=0;i<list.size();i++){     
            String name = list.get(i).toString();     
            System.out.println(name);     
        }
        */ 
       
       
        //下载单文件              
        //long result2 =
ftp.downloadFile("IP.txt","E:/javaWP/Ttt/IP.txt");
        //System.out.println(result2==0?"下载失败!":"下载成功!");
          
       
        //下载文件夹   
        List list = ");  
             for (int i=0;i<list.size();i++)  
              {  
                 String filename = (String)list.get(i);  
                 System.out.println(filename);  
                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值