ftp上传下载 java FTPClient (zhuan)

项目需要,网上搜了搜,很多,但问题也不少,估计转来转去,少了不少东西,而且也情况也不太一样。没办法,只能自己去写一个。  

  •   
  • 一,    安装sserv-u ftp服务器 版本10.1.0.1   
  •   
  • 我所设服务器配置:  
  •   
  • 用户名:shiyanming  
  •   
  • 密码:123  
  •   
  • 端口:21  
  •   
  • 跟目录:D:/ftpindex  
  •   
  •    
  •   
  •    
  •   
  • 二、所需jar包:common-net-1.4.1.jar  
  •   
  • jakarta-oro-2.0.8.jar  
  •   
  •   注意:第二个jar包必须要存在,不然在列举ftp服务器中文件是出错  
  •   
  •    
  •   
  •    
  •   
  • 三、中文传输问题  
  •   
  •  四、具体程序   com.ftp. SeforgeFtpUtils.java  
  •   
  •    
  •   
  • package com.ftp;  
  •   
  • import java.io.File;  
  •   
  • import java.io.FileInputStream;  
  •   
  • import java.io.FileNotFoundException;  
  •   
  • import java.io.FileOutputStream;  
  •   
  • import java.io.IOException;  
  •   
  • import java.io.InputStream;  
  •   
  • import java.io.OutputStream;  
  •   
  • import java.net.URLEncoder;  
  •   
  • import javax.servlet.http.HttpServletResponse;  
  •   
  • import org.apache.commons.net.ftp.FTP;  
  •   
  • import org.apache.commons.net.ftp.FTPClient;  
  •   
  • import org.apache.commons.net.ftp.FTPClientConfig;  
  •   
  • import org.apache.commons.net.ftp.FTPFile;  
  •   
  • import org.apache.commons.net.ftp.FTPReply;  
  •   
  • /** 
  •  
  •  * @author shiyanming 
  •  
  •  *  
  •  
  •  */  
  •   
  • public class SeforgeFtpUtils {  
  •   
  •  /** 
  •  
  •   * 上传程序方法 
  •  
  •   *  
  •  
  •   */  
  •   
  •  public boolean uploadFile(String url, int port, String username,  
  •   
  •    String password, String path, String filename, InputStream input) {  
  •   
  •   // filename:要上传的文件  
  •   
  •   // path :上传的路径  
  •   
  •   // 初始表示上传失败  
  •   
  •   boolean success = false;  
  •   
  •   // 创建FTPClient对象  
  •   
  •   FTPClient ftp = new FTPClient();  
  •   
  •   try {  
  •   
  •    int reply;  
  •   
  •    // 连接FTP服务器  
  •   
  •    // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
  •   
  •    ftp.connect(url, port);  
  •   
  •    // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件  
  •   
  •    ftp.setControlEncoding("GBK");  
  •   
  •    FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
  •   
  •    conf.setServerLanguageCode("zh");  
  •   
  •    // 登录ftp  
  •   
  •    ftp.login(username, password);  
  •   
  •    // 看返回的值是不是230,如果是,表示登陆成功  
  •   
  •    reply = ftp.getReplyCode();  
  •   
  •    // 以2开头的返回值就会为真  
  •   
  •    if (!FTPReply.isPositiveCompletion(reply)) {  
  •   
  •     ftp.disconnect();  
  •   
  •     System.out.println("连接服务器失败");  
  •   
  •     return success;  
  •   
  •    }  
  •   
  •    System.out.println("登陆服务器成功");  
  •   
  •    ftp.changeWorkingDirectory(path);// 转移到FTP服务器目录  
  •   
  •    FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表  
  •   
  •    System.out.println(fs.length);  
  •   
  •    System.out.println(filename);  
  •   
  •          String filename1 = SeforgeFtpUtils.changeName(filename, fs);     
  •   
  •      
  •   
  •      
  •   
  •    String filename2 = new String(filename1.getBytes("GBK"),  
  •   
  •      "ISO-8859-1");  
  •   
  •    String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");  
  •   
  •    // 转到指定上传目录  
  •   
  •    ftp.changeWorkingDirectory(path1);  
  •   
  •    // 将上传文件存储到指定目录  
  •   
  •    // ftp.appendFile(new String(filename.getBytes("GBK"),"ISO-8859-1"),  
  •   
  •    // input);  
  •   
  •    ftp.setFileType(FTP.BINARY_FILE_TYPE);   
  •   
  • //如果缺省该句 传输txt正常 但图片和其他格式的文件传输出现乱码  
  •   
  •    ftp.storeFile(filename2, input);  
  •   
  •    // 关闭输入流  
  •   
  •    input.close();  
  •   
  •    // 退出ftp  
  •   
  •    ftp.logout();  
  •   
  •    // 表示上传成功  
  •   
  •    success = true;  
  •   
  •    System.out.println("上传成功。。。。。。");  
  •   
  •   } catch (IOException e) {  
  •   
  •    e.printStackTrace();  
  •   
  •   } finally {  
  •   
  •    if (ftp.isConnected()) {  
  •   
  •     try {  
  •   
  •      ftp.disconnect();  
  •   
  •     } catch (IOException ioe) {  
  •   
  •     }  
  •   
  •    }  
  •   
  •   }  
  •   
  •   return success;  
  •   
  •  }  
  •   
  •  /** 
  •  
  •   * 删除程序 
  •  
  •   *  
  •  
  •   */  
  •   
  •  public boolean deleteFile(String url, int port, String username,  
  •   
  •    String password, String path, String filename) {  
  •   
  •   // filename:要上传的文件  
  •   
  •   // path :上传的路径  
  •   
  •   // 初始表示上传失败  
  •   
  •   boolean success = false;  
  •   
  •   // 创建FTPClient对象  
  •   
  •   FTPClient ftp = new FTPClient();  
  •   
  •   try {  
  •   
  •    int reply;  
  •   
  •    // 连接FTP服务器  
  •   
  •    // 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器  
  •   
  •    ftp.connect(url, port);  
  •   
  •    // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件  
  •   
  •    ftp.setControlEncoding("GBK");  
  •   
  •    FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
  •   
  •    conf.setServerLanguageCode("zh");  
  •   
  •    // 登录ftp  
  •   
  •    ftp.login(username, password);  
  •   
  •    // 看返回的值是不是230,如果是,表示登陆成功  
  •   
  •    reply = ftp.getReplyCode();  
  •   
  •    // 以2开头的返回值就会为真  
  •   
  •    if (!FTPReply.isPositiveCompletion(reply)) {  
  •   
  •     ftp.disconnect();  
  •   
  •     System.out.println("连接服务器失败");  
  •   
  •     return success;  
  •   
  •    }  
  •   
  •    System.out.println("登陆服务器成功");  
  •   
  •    String filename2 = new String(filename.getBytes("GBK"),  
  •   
  •      "ISO-8859-1");  
  •   
  •    String path1 = new String(path.getBytes("GBK"), "ISO-8859-1");  
  •   
  •    // 转到指定上传目录  
  •   
  •    ftp.changeWorkingDirectory(path1);  
  •   
  •    FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表  
  •   
  •    ftp.deleteFile(filename2);  
  •   
  •    ftp.logout();  
  •   
  •    success=true;  
  •   
  •   } catch (IOException e) {  
  •   
  • System.out.println(e);      
  •   
  •   } finally {  
  •   
  •    if (ftp.isConnected()) {  
  •   
  •     try {  
  •   
  •      ftp.disconnect();  
  •   
  •     } catch (IOException ioe) {  
  •   
  •     }  
  •   
  •    }  
  •   
  •   }  
  •   
  •   return success;  
  •   
  •  }  
  •   
  •    
  •   
  •  /** 
  •  
  •   * 下载程序 
  •  
  •   *  
  •  
  •   */  
  •   
  •  public static boolean downFile(String ip, int port, String username,  
  •   
  •    String password, String remotePath, String fileName,  
  •   
  •    OutputStream outputStream, HttpServletResponse response) {  
  •   
  •   boolean success = false;  
  •   
  •   FTPClient ftp = new FTPClient();  
  •   
  •   try {  
  •   
  •    int reply;  
  •   
  •    ftp.connect(ip, port);  
  •   
  •    // 下面三行代码必须要,而且不能改变编码格式  
  •   
  •    ftp.setControlEncoding("GBK");  
  •   
  •    FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
  •   
  •    conf.setServerLanguageCode("zh");  
  •   
  •    // 如果采用默认端口,可以使用ftp.connect(url) 的方式直接连接FTP服务器  
  •   
  •    ftp.login(username, password);// 登录  
  •   
  •    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
  •   
  •    reply = ftp.getReplyCode();  
  •   
  •    if (!FTPReply.isPositiveCompletion(reply)) {  
  •   
  •     ftp.disconnect();  
  •   
  •     return success;  
  •   
  •    }  
  •   
  •    System.out.println("登陆成功。。。。");  
  •   
  •    ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录  
  •   
  •    FTPFile[] fs = ftp.listFiles(); // 得到目录的相应文件列表  
  •   
  •    // System.out.println(fs.length);//打印列表长度  
  •   
  •    for (int i = 0; i < fs.length; i++) {  
  •   
  •     FTPFile ff = fs[i];  
  •   
  •     if (ff.getName().equals(fileName)) {  
  •   
  •      String filename = fileName;  
  •   
  •      // 这个就就是弹出下载对话框的关键代码  
  •   
  •      response.setHeader("Content-disposition",  
  •   
  •        "attachment;filename="  
  •   
  •          + URLEncoder.encode(filename, "utf-8"));  
  •   
  •      // 将文件保存到输出流outputStream中  
  •   
  •      ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),  
  •   
  •        "ISO-8859-1"), outputStream);  
  •   
  •      outputStream.flush();  
  •   
  •      outputStream.close();  
  •   
  •     }  
  •   
  •    }  
  •   
  •    ftp.logout();  
  •   
  •    success = true;  
  •   
  •   } catch (IOException e) {  
  •   
  •    e.printStackTrace();  
  •   
  •   } finally {  
  •   
  •    if (ftp.isConnected()) {  
  •   
  •     try {  
  •   
  •      ftp.disconnect();  
  •   
  •     } catch (IOException ioe) {  
  •   
  •     }  
  •   
  •    }  
  •   
  •   }  
  •   
  •   return success;  
  •   
  •  }  
  •   
  •  // 判断是否有重名方法  
  •   
  •  public static boolean isDirExist(String fileName, FTPFile[] fs) {  
  •   
  •   for (int i = 0; i < fs.length; i++) {  
  •   
  •    FTPFile ff = fs[i];  
  •   
  •    if (ff.getName().equals(fileName)) {  
  •   
  •     return true; // 如果存在返回 正确信号  
  •   
  •    }  
  •   
  •   }  
  •   
  •   return false; // 如果不存在返回错误信号  
  •   
  •  }  
  •   
  •  // 根据重名判断的结果 生成新的文件的名称  
  •   
  •  public static String changeName(String filename, FTPFile[] fs){  
  •   
  •   int n = 0;  
  •   
  •   // 创建一个可变的字符串对象 即StringBuffer对象,把filename值付给该对象  
  •   
  •   StringBuffer filename1 = new StringBuffer("");  
  •   
  •   filename1 = filename1.append(filename);  
  •   
  •   System.out.println(filename1);  
  •   
  •   while (isDirExist(filename1.toString(), fs)) {  
  •   
  •    n++;  
  •   
  •    String a = "[" + n + "]";  
  •   
  •    System.out.println("字符串a的值是:" + a);  
  •   
  •    int b = filename1.lastIndexOf(".");// 最后一出现小数点的位置  
  •   
  •    int c = filename1.lastIndexOf("[");// 最后一次"["出现的位置  
  •   
  •    if (c < 0) {  
  •   
  •     c = b;  
  •   
  •    }  
  •   
  •    StringBuffer name = new StringBuffer(filename1.substring(0, c));// 文件的名字  
  •   
  •    StringBuffer suffix = new StringBuffer(filename1.substring(b + 1));// 后缀的名称  
  •   
  •    filename1 = name.append(a).append(".").append(suffix);  
  •   
  •   }  
  •   
  •   return filename1.toString();  
  •   
  •  }  
  •   
  •  /** 
  •  
  •   * @param args 
  •  
  •   * @throws FileNotFoundException 
  •  
  •   *             测试程序 
  •  
  •   */  
  •   
  •  public static void main(String[] args) throws FileNotFoundException {  
  •   
  •   String path = "";  
  •   
  •   File f1 = new File("C:\\新.txt");  
  •   
  •   String filename = f1.getName();  
  •   
  •   System.out.println(filename);  
  •   
  •   //InputStream input = new FileInputStream(f1);  
  •   
  •   //SeforgeFtpUtils a = new SeforgeFtpUtils();  
  •   
  •   //a.uploadFile("172.25.5.193", 21, "shiyanming", "123", path, filename, input);  
  •   
  •   /* 
  •  
  •    * String path ="D:\\ftpindex\\"; File f2 = new 
  •  
  •    * File("D:\\ftpindex\\old.txt"); String filename2= f2.getName(); 
  •  
  •    * System.out.println(filename2); SeforgeFtpUtils a = new 
  •  
  •    * SeforgeFtpUtils(); a.downFile("172.25.5.193", 21, "shi", "123", path, 
  •  
  •    * filename2, "C:\\"); 
  •  
  •    */  
  •   
  •     
  •   
  •   SeforgeFtpUtils a = new SeforgeFtpUtils();  
  •   
  •   a.deleteFile("192.168.0.100", 21, "shiyanming", "123", path, filename);  
  •   
  •  }  
  •   
  • }  
  •   
  • 上边程序完成了文件的上传和下载  
  •   
  •   
  •   
  • 重命名判断问题,如果重名,在后边加(n)。  
  •   
  •   
  •   
  • 存在问题:如果jsp页面中读取from表单的值,只能获取主机的地址,不能上传客户端文件。  
  •   
  •   
  •   
  •    
  •   
  •      
  •   
  •    
  •   
  •    
  •   
  • 3.1、 默认情况下,FtpClient使用的是UTF_8字符集作为服务器通讯的编码集。而FTP服务器SERV-U在windowsXP上,使用GBK字符集作为服务器通讯。  
  •   
  •    
  •   
  •     
  •   
  • // 下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件  
  •   
  •     ftp.setControlEncoding("GBK");  
  •   
  •     FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);  
  •   
  • conf.setServerLanguageCode("zh");  
  •   
  •    
  •   
  • 3.2、同时还要设置服务器  
  •   
  • 设置步骤:  
  •   
  •       1、打开Serv-U 8.0控制台,点击“限制和设置”--“为域配置高级FTP命令设置和行为”。  
  •   
  •       2、在FTP设置中找到OPTS UTF8命令,右击禁用此命令。3、点击下面的“全局属性”。  
  •   
  •       4、在出来的FTP命令属性选项卡中,“高级选项”里,把“对所有收发的路径和文件名使用UFT-8编码”前面的钩去掉!  
  •   
  •       5、以后再上传中文文件,就不会出现乱码问题啦。  
posted @ 2015-07-02 00:50  swugogo  阅读(276)  评论(0编辑  收藏  举报