zoukankan      html  css  js  c++  java
  • 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、以后再上传中文文件,就不会出现乱码问题啦。  
  • 相关阅读:
    bzoj2669 [cqoi2012]局部极小值 状压DP+容斥
    bzoj2560 串珠子 状压DP
    bzoj2004 [Hnoi2010]Bus 公交线路 矩阵快速幂+状压DP
    「校内训练 2019-04-23」越野赛车问题 动态dp+树的直径
    bzoj5210 最大连通子块和 动态 DP + 堆
    动态 DP 学习笔记
    bzoj4987 Tree 树上背包
    bzoj1190 [HNOI2007]梦幻岛宝珠 背包
    bzoj1004 [HNOI2008]Cards Burnside 引理+背包
    bzoj4922 [Lydsy1706月赛]Karp-de-Chant Number 贪心+背包
  • 原文地址:https://www.cnblogs.com/swugogo/p/4614963.html
Copyright © 2011-2022 走看看