Java FTP 实现跨服务器文件上传下载

转自:http://blog.csdn.net/for_china2012/article/details/16820607

实现原理:服务器端安装 Serv-U 服务器,环境配置好后通过Java程序访问(读、写、删除等操作)目录。

        Serv-U下载地址:http://download.csdn.net/detail/for_china2012/6574769

[java]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.ftp.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6.   
  7. import org.apache.commons.net.ftp.FTPClient;  
  8. import org.apache.commons.net.ftp.FTPReply;  
  9.   
  10. /** 
  11.  * FTP服务器工具类 
  12.  *  
  13.  * @author 码农先生 
  14.  * @version 1.0 
  15.  * @date 2013-11-18 
  16.  */  
  17. public class FTPUtils {  
  18.       
  19.     private static FTPUtils ftpUtils;  
  20.     private FTPClient ftpClient;  
  21.       
  22.     private String port; // 服务器端口  
  23.     private String username; // 用户登录名  
  24.     private String password; // 用户登录密码  
  25.       
  26.     private InputStream is; // 文件下载输入流  
  27.       
  28.     /** 
  29.      * 私有构造方法 
  30.      */  
  31.     private FTPUtils() {  
  32.         initConfig();  
  33.         if (null == ftpClient) {  
  34.             ftpClient = new FTPClient();  
  35.         }  
  36.     }  
  37.   
  38.     /** 
  39.      * 获取FTPUtils对象实例 
  40.      * @return 
  41.      *      FTPUtils对象实例 
  42.      */  
  43.     public synchronized static FTPUtils getInstance () {  
  44.         if (null == ftpUtils) {  
  45.             ftpUtils = new FTPUtils();  
  46.         }  
  47.         return ftpUtils;  
  48.     }  
  49.       
  50.     /** 
  51.      * 初始化FTP服务器连接属性 
  52.      */  
  53.     public void initConfig () {  
  54.         // 构造Properties对象  
  55.         Properties properties = new Properties();  
  56.           
  57.         // 定义配置文件输入流  
  58.         InputStream is = null;  
  59.         try {  
  60.             // 获取配置文件输入流  
  61.             is = FTPUtils.class.getResourceAsStream("/ftp.properties");  
  62.             // 加载配置文件  
  63.             properties.load(is);  
  64.             // 读取配置文件  
  65.             port = (String) properties.get("port"); // 设置端口  
  66.             username = (String) properties.get("username"); // 设置用户名  
  67.             password = (String) properties.get("password"); // 设置密码  
  68.         } catch (IOException e) {  
  69.             e.printStackTrace();  
  70.         } finally {  
  71.             // 判断输入流是否为空  
  72.             if (null != is) {  
  73.                 try {  
  74.                     // 关闭输入流  
  75.                     is.close();  
  76.                 } catch (IOException e) {  
  77.                     e.printStackTrace();  
  78.                 }  
  79.             }  
  80.         }  
  81.     }  
  82.       
  83.     /** 
  84.      * 连接(配置通用连接属性)至服务器 
  85.      *  
  86.      * @param serverName 
  87.      *      服务器名称 
  88.      * @param remotePath 
  89.      *      当前访问目录 
  90.      * @return 
  91.      *      <b>true</b>:连接成功 
  92.      *      <br/> 
  93.      *      <b>false</b>:连接失败 
  94.      */  
  95.     public boolean connectToTheServer (String serverName, String remotePath) {  
  96.         // 定义返回值  
  97.         boolean result = false;  
  98.         try {  
  99.             // 连接至服务器,端口默认为21时,可直接通过URL连接  
  100.             ftpClient.connect(serverName, Integer.parseInt(port));  
  101.             // 登录服务器  
  102.             ftpClient.login(username, password);  
  103.             // 判断返回码是否合法  
  104.             if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {  
  105.                 // 不合法时断开连接  
  106.                 ftpClient.disconnect();  
  107.                 // 结束程序  
  108.                 return result;  
  109.             }  
  110.             // 设置文件操作目录  
  111.             result = ftpClient.changeWorkingDirectory(remotePath);  
  112.             // 设置文件类型,二进制  
  113.             result = ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
  114.             // 设置缓冲区大小  
  115.             ftpClient.setBufferSize(3072);  
  116.             // 设置字符编码  
  117.             ftpClient.setControlEncoding("UTF-8");  
  118.         } catch (IOException e) {  
  119.             e.printStackTrace();  
  120.         }  
  121.         return result;  
  122.     }  
  123.       
  124.     /** 
  125.      * 上传文件至FTP服务器 
  126.      *  
  127.      * @param serverName 
  128.      *      服务器名称 
  129.      * @param storePath 
  130.      *      上传文件存储路径 
  131.      * @param fileName 
  132.      *      上传文件存储名称 
  133.      * @param is 
  134.      *      上传文件输入流 
  135.      * @return 
  136.      *      <b>true</b>:上传成功 
  137.      *      <br/> 
  138.      *      <b>false</b>:上传失败 
  139.      */  
  140.     public boolean storeFile (String serverName, String storePath, String fileName, InputStream is) {  
  141.         boolean result = false;  
  142.         try {  
  143.             // 连接至服务器  
  144.             result = connectToTheServer(serverName, storePath);  
  145.             // 判断服务器是否连接成功  
  146.             if (result) {  
  147.                 // 上传文件  
  148.                 result = ftpClient.storeFile(fileName, is);  
  149.             }  
  150.             // 关闭输入流  
  151.             is.close();  
  152.         } catch (IOException e) {  
  153.             e.printStackTrace();  
  154.         } finally {  
  155.             // 判断输入流是否存在  
  156.             if (null != is) {  
  157.                 try {  
  158.                     // 关闭输入流  
  159.                     is.close();  
  160.                 } catch (IOException e) {  
  161.                     e.printStackTrace();  
  162.                 }  
  163.             }  
  164.             // 登出服务器并断开连接  
  165.             ftpUtils.logout();  
  166.         }  
  167.         return result;  
  168.     }  
  169.       
  170.     /** 
  171.      * 下载FTP服务器文件至本地<br/> 
  172.      * 操作完成后需调用logout方法与服务器断开连接 
  173.      *  
  174.      * @param serverName 
  175.      *      服务器名称 
  176.      * @param remotePath 
  177.      *      下载文件存储路径 
  178.      * @param fileName 
  179.      *      下载文件存储名称 
  180.      * @return 
  181.      *      <b>InputStream</b>:文件输入流 
  182.      */  
  183.     public InputStream retrieveFile (String serverName, String remotePath, String fileName) {  
  184.         try {  
  185.             boolean result = false;  
  186.             // 连接至服务器  
  187.             result = connectToTheServer(serverName, remotePath);  
  188.             // 判断服务器是否连接成功  
  189.             if (result) {  
  190.                 // 获取文件输入流  
  191.                 is = ftpClient.retrieveFileStream(fileName);  
  192.             }  
  193.         } catch (IOException e) {  
  194.             e.printStackTrace();  
  195.         }  
  196.         return is;  
  197.     }  
  198.       
  199.     /** 
  200.      * 删除FTP服务器文件 
  201.      *  
  202.      * @param serverName 
  203.      *      服务器名称 
  204.      * @param remotePath 
  205.      *      当前访问目录 
  206.      * @param fileName 
  207.      *      文件存储名称 
  208.      * @return 
  209.      *      <b>true</b>:删除成功 
  210.      *      <br/> 
  211.      *      <b>false</b>:删除失败 
  212.      */  
  213.     public boolean deleteFile (String serverName, String remotePath, String fileName) {  
  214.         boolean result = false;  
  215.         // 连接至服务器  
  216.         result = connectToTheServer(serverName, remotePath);  
  217.         // 判断服务器是否连接成功  
  218.         if (result) {  
  219.             try {  
  220.                 // 删除文件  
  221.                 result = ftpClient.deleteFile(fileName);  
  222.             } catch (IOException e) {  
  223.                 e.printStackTrace();  
  224.             } finally {  
  225.                 // 登出服务器并断开连接  
  226.                 ftpUtils.logout();  
  227.             }  
  228.         }  
  229.         return result;  
  230.     }  
  231.       
  232.     /** 
  233.      * 检测FTP服务器文件是否存在 
  234.      *  
  235.      * @param serverName 
  236.      *      服务器名称 
  237.      * @param remotePath 
  238.      *      检测文件存储路径 
  239.      * @param fileName 
  240.      *      检测文件存储名称 
  241.      * @return 
  242.      *      <b>true</b>:文件存在 
  243.      *      <br/> 
  244.      *      <b>false</b>:文件不存在 
  245.      */  
  246.     public boolean checkFile (String serverName, String remotePath, String fileName) {  
  247.         boolean result = false;  
  248.         try {  
  249.             // 连接至服务器  
  250.             result = connectToTheServer(serverName, remotePath);  
  251.             // 判断服务器是否连接成功  
  252.             if (result) {  
  253.                 // 默认文件不存在  
  254.                 result = false;  
  255.                 // 获取文件操作目录下所有文件名称  
  256.                 String[] remoteNames = ftpClient.listNames();  
  257.                 // 循环比对文件名称,判断是否含有当前要下载的文件名  
  258.                 for (String remoteName: remoteNames) {  
  259.                     if (fileName.equals(remoteName)) {  
  260.                         result = true;  
  261.                     }  
  262.                 }  
  263.             }  
  264.         } catch (IOException e) {  
  265.             e.printStackTrace();  
  266.         } finally {  
  267.             // 登出服务器并断开连接  
  268.             ftpUtils.logout();  
  269.         }  
  270.         return result;  
  271.     }  
  272.   
  273.     /** 
  274.      * 登出服务器并断开连接 
  275.      *  
  276.      * @param ftp 
  277.      *      FTPClient对象实例 
  278.       * @return 
  279.      *      <b>true</b>:操作成功 
  280.      *      <br/> 
  281.      *      <b>false</b>:操作失败 
  282.      */  
  283.     public boolean logout () {  
  284.         boolean result = false;  
  285.         if (null != is) {  
  286.             try {  
  287.                 // 关闭输入流  
  288.                 is.close();  
  289.             } catch (IOException e) {  
  290.                 e.printStackTrace();  
  291.             }  
  292.         }  
  293.         if (null != ftpClient) {  
  294.             try {  
  295.                 // 登出服务器  
  296.                 result = ftpClient.logout();  
  297.             } catch (IOException e) {  
  298.                 e.printStackTrace();  
  299.             } finally {  
  300.                 // 判断连接是否存在  
  301.                 if (ftpClient.isConnected()) {  
  302.                     try {  
  303.                         // 断开连接  
  304.                         ftpClient.disconnect();  
  305.                     } catch (IOException e) {  
  306.                         e.printStackTrace();  
  307.                     }  
  308.                 }  
  309.             }  
  310.         }  
  311.         return result;  
  312.     }  
  313.       
  314. }  

Demo下载地址:http://download.csdn.net/detail/for_china2012/6575341

【参考文章】

http://lavasoft.blog.51cto.com/62575/93883/

http://blog.csdn.net/hbcui1984/article/details/2720204

http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值