设为首页 收藏本站
查看: 1155|回复: 0

[经验分享] FTP工具类,在NC客开过程中遇到使用ftp的可以直接使用

[复制链接]

尚未签到

发表于 2016-6-9 12:05:25 | 显示全部楼层 |阅读模式
  package nc.bs.ht.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 nc.vo.hr.tools.pub.StringUtils;
import nc.vo.pub.BusinessException;
  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;
  
  /**
* FTP工具类
* @author 麻杰 <br>
  *  日期:2010-08-10
 */
  public class FtpTools {
 /**
  * 上传程序方法
  *
  */
 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 = FtpTools.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 TestCon(String ip, int port, String username,String password) throws BusinessException {
   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();
      throw new BusinessException("用户名密码不正确");
      //return success;
     }
     System.out.println("登陆成功。。。。");
     ftp.logout();
     success = true;
   }catch (Exception e) {
   if (e instanceof BusinessException) {
    throw (BusinessException) e;
   }else{
             throw new BusinessException(e.getMessage(), 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,String localPath
   ) {
  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);//打印列表长度
  if (StringUtils.hasText(fileName)){
    for (int i = 0; i < fs.length; i++) {
      FTPFile ff = fs;
      if (ff.getName().equals(fileName)) {
  //       String filename = fileName;
  //       // 这个就就是弹出下载对话框的关键代码
//       response.setHeader("Content-disposition",
//         "attachment;filename="
//           + URLEncoder.encode(filename, "utf-8"));
       // 将文件保存到输出流outputStream中
      
             File file_out = new File(localPath + File.separator + ff.getName());  
             FileOutputStream outputStream = new FileOutputStream(file_out); 
       ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
       outputStream.flush();
       outputStream.close();
      }
     }
   }else {
    for (int i = 0; i < fs.length; i++) {
      FTPFile ff = fs;
     
      if (ff.isFile()){
       File file_out_bak = new File(localPath + File.separator + ff.getName() + "bak");
       File file_out = new File(localPath + File.separator + ff.getName());
       if (file_out.exists()){
        long timestamp1 = ff.getTimestamp().getTimeInMillis();
        long timestamp2 = file_out.lastModified();
        if (timestamp1>timestamp2){
         file_out.renameTo(new File(localPath + File.separator + file_out.getName()+"update"));
         File file_out2 = new File(localPath + File.separator + ff.getName());
               FileOutputStream outputStream = new FileOutputStream(file_out2);  
          // 将文件保存到输出流outputStream中
          ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
          outputStream.flush();
          outputStream.close();
        }
       }else if (file_out_bak.exists()){
        long timestamp1 = ff.getTimestamp().getTimeInMillis();
        long timestamp2 = file_out_bak.lastModified();
        if (timestamp1>timestamp2){
               FileOutputStream outputStream = new FileOutputStream(file_out);  
          // 将文件保存到输出流outputStream中
          ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
          outputStream.flush();
          outputStream.close();
        }
       }else {
              FileOutputStream outputStream = new FileOutputStream(file_out);  
         // 将文件保存到输出流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;
   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();
 }
  }
  
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-228232-1-1.html 上篇帖子: FTP主动模式和被动模式的比较 下篇帖子: Java的FTP协议级客户端实现详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表