最近在写一个项目,需要用到FTP服务,就从网上搜了一下,发现Apache Ftp Server相对来说使用方便,性能稳定,效率高,且该服务器是开源免费的,而且该服务器与spring容器可以无缝的融合到一起,下面是我写的一个例子,供有需要的参考。

第一步:下载jar包,拷贝到项目的lib目录下,jar包请参照附件

第二步:添加配置文件ftpserver.xml,具体内容如下:


java怎么监听ftp共享文件夹的文件新增吗_spring



1. <?xml version="1.0" encoding="UTF-8"?>
2. <beans xmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns:beans="http://www.springframework.org/schema/beans"
5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
6. >
7.       
8. <!-- FTP服务器启动参数配置 -->
9. <server xmlns="http://mina.apache.org/ftpserver/spring/v1"
10. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
11. xsi:schemaLocation="http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd"
12. id="ftpServer"
13. max-logins="500"
14. anon-enabled="false"
15. max-anon-logins="0"
16. max-login-failures="3"
17. login-failure-delay="500">
18. <listeners>
19. <nio-listener name="default" port="2121" idle-timeout="60">
20. <ssl>
21. <keystore file="ftpserver.jks" password="password" />
22. </ssl>
23. </nio-listener>
24. </listeners>
25. <!-- <file-user-manager file="users.properties" /> -->
26. <db-user-manager>
27. <data-source>
28. <beans:bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
29. <beans:property name="driverClass" value="${jdbc.driverClassName}" />
30. <beans:property name="jdbcUrl" value="${jdbc.url}" />
31. <beans:property name="user" value="${jdbc.username}" />
32. <beans:property name="password" value="${jdbc.password}" />
33. </beans:bean>
34. </data-source>
35. <insert-user>
36.                 INSERT INTO FtpUser   
37.                     (userid, userpassword, homedirectory, enableflag, writepermission, idletime, uploadrate, downloadrate)   
38.                 VALUES   
39.                     ('{userid}', '{userpassword}', '{homedirectory}', true, true, {idletime}, {uploadrate}, {downloadrate})  
40. </insert-user>
41. <update-user>
42.                 UPDATE FtpUser SET  
43. userpassword='{userpassword}',  
44. homedirectory='{homedirectory}',  
45. enableflag={enableflag},  
46. writepermission={writepermission},  
47. idletime={idletime},  
48. uploadrate={uploadrate},  
49. downloadrate={downloadrate}  
50.                 WHERE   
51. userid='{userid}'
52. </update-user>
53. <delete-user>DELETE FROM FtpUser WHERE userid = '{userid}'</delete-user>
54. <select-user>
55.                 SELECT   
56.                     userid, userpassword, homedirectory,  
57.                     enableflag, writepermission, idletime, uploadrate, downloadrate,  
58.                     maxloginnumber, maxloginperip   
59.                 FROM   
60.                     FtpUser   
61.                 WHERE   
62. userid = '{userid}'
63. </select-user>
64. <select-all-users>SELECT userid FROM FtpUser ORDER BY userid</select-all-users>
65. <is-admin>
66. userid='{userid}' AND userid='admin'
67. </is-admin>
68. <authenticate>SELECT userpassword from FtpUser WHERE userid='{userid}'</authenticate>
69. </db-user-manager>
70. </server>
71. </beans>


        注:FTP用户的管理方式我使用的是数据库的方式

data-source里面的beans:property值都是从jdbc.properties中获取的,资源值是通过spring获取的



java怎么监听ftp共享文件夹的文件新增吗_spring


1. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
2. <property name="locations">
3. <list>
4. <value>classpath:jdbc.properties</value>
5. </list>
6. </property>
7. </bean>


jdbc.properties内容请参照附件

把该文件导入到spring配置文件中,代码如下:


java怎么监听ftp共享文件夹的文件新增吗_spring



    1. <!-- 导入FTP SERVER配置 -->
    2. <import resource="classpath:/ftpserver.xml"/>


     

     第三步:拷贝ftpserver.jks文件到src目录,该文件在apache-ftpserver-1.0.6\res目录下

     

     第四步:建立FTP服务监听类FtpServerListener,代码如下:


    java怎么监听ftp共享文件夹的文件新增吗_spring


    1. package
    2.   
    3. import
    4.   
    5. import
    6. import
    7.   
    8. import
    9. import
    10. import
    11. import
    12. import
    13. import
    14.   
    15. import
    16.   
    17. /**
    18.  * <FTP SERVER操作类>
    19.  * <功能详细描述>
    20.  * @author  wenkaixuan
    21.  * @version  [版本号, 2014-3-31]
    22.  * @see  [相关类/方法]
    23.  * @since  [产品/模块版本]
    24.  */
    25. public class FtpServerListener implements
    26. {  
    27. /**
    28.      * 日志对象
    29.      */
    30. private Log logger = LogFactory.getLog(FtpServerListener.class);  
    31.       
    32. /**
    33.      * {@inheritDoc}
    34.      */
    35. public void
    36.     {  
    37. "Stopping FtpServer");  
    38. "FTPSERVER_CONTEXT_NAME");  
    39. if (server != null)  
    40.         {  
    41.             server.stop();  
    42. "FTPSERVER_CONTEXT_NAME");  
    43. "FtpServer stopped");  
    44.         }  
    45. else
    46.         {  
    47. "No running FtpServer found");  
    48.         }  
    49.     }  
    50.       
    51. /**
    52.      * {@inheritDoc}
    53.      */
    54. public void
    55.     {  
    56. "Starting FtpServer");  
    57.         WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());  
    58. "ftpServer");  
    59. "FTPSERVER_CONTEXT_NAME", server);  
    60. try
    61.         {  
    62. // 获取操作系统
    63. "os.name");  
    64.               
    65. // 如果是windows系統
    66. if (osName.toLowerCase().indexOf("windows") > -1)  
    67.             {  
    68. // 设置FTP路径
    69. "C:\\ftpServer";  
    70.             }  
    71. else
    72.             {  
    73. // 设置FTP路径
    74. "/home/ftpServer";  
    75.             }  
    76.               
    77. // 判断该路径是否存在,如果不存在则创建
    78. new
    79. if
    80.             {  
    81.                 file.mkdirs();  
    82.             }  
    83.               
    84. // 更新FTP服务器用户信息
    85. // 首先获取到FTP用户管理对象
    86.             UserManager userManage = server.getUserManager();  
    87.               
    88. // 删除原有的用户信息
    89.             userManage.delete(Global.ftpUserName);  
    90.               
    91. // 构造新的用户并保存到数据库
    92. new
    93.             base.setName(Global.ftpUserName);  
    94.             base.setPassword(Global.ftpPassword);  
    95.             base.setHomeDirectory(Global.ftpPath);  
    96.             userManage.save(base);  
    97.               
    98. // 启动FTP服务
    99.             server.start();  
    100. "FtpServer started");  
    101.         }  
    102. catch
    103.         {  
    104. "Failed to start FtpServer");  
    105.             logger.error(Global.LOG_EXCEPTION_NAME, e);  
    106.         }  
    107.     }  
    108. }


     在web.xml中配置该监听器,代码如下:


    java怎么监听ftp共享文件夹的文件新增吗_spring


    1. <!-- Spring 容器启动监听器 -->
    2. <listener>
    3. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    4. <listener-class>com.blingtel.ftp.FtpServerListener</listener-class>
    5. </listener>


     

     第五步:建立FTP用户实体类,用于实现用户的增删查,该实体类必须要实现User接口,代码如下:


    java怎么监听ftp共享文件夹的文件新增吗_spring

    1. package
    2.   
    3. import
    4.   
    5. import
    6. import
    7. import
    8.   
    9. /**
    10.  * <一句话功能简述>
    11.  * <功能详细描述>
    12.  * @author  wenkaixuan
    13.  * @version  [版本号, 2014-3-31]
    14.  * @see  [相关类/方法]
    15.  * @since  [产品/模块版本]
    16.  */
    17. public class BaseUser implements
    18. {  
    19. private
    20.       
    21. private
    22.       
    23. private
    24.       
    25. public void
    26.     {  
    27. this.name = name;  
    28.     }  
    29.       
    30. public void
    31.     {  
    32. this.password = password;  
    33.     }  
    34.       
    35. public void
    36.     {  
    37. this.homeDirectory = homeDirectory;  
    38.     }  
    39.       
    40. public
    41.     {  
    42. return null;  
    43.     }  
    44.       
    45. public
    46.     {  
    47. return null;  
    48.     }  
    49.       
    50. public List<Authority> getAuthorities(Class<? extends
    51.     {  
    52. return null;  
    53.     }  
    54.       
    55. public boolean
    56.     {  
    57. return true;  
    58.     }  
    59.       
    60. public
    61.     {  
    62. return
    63.     }  
    64.       
    65. public int
    66.     {  
    67. return 0;  
    68.     }  
    69.       
    70. public
    71.     {  
    72. return
    73.     }  
    74.       
    75. public
    76.     {  
    77. return
    78.     }  
    79.       
    80. /**
    81.      * @return 返回 writepermission
    82.      */
    83. public boolean
    84.     {  
    85. return true;  
    86.     }  
    87. }


     

    Global.ftpUserName的用户到数据库

     

    另外,FTP用户表结构如下:


    java怎么监听ftp共享文件夹的文件新增吗_spring


    1. #FTP用户信息表  
    2. create table
    3. (  
    4. varchar(64) not null primary key,  
    5. varchar(64),  
    6. varchar(128) not null,  
    7. default true,  
    8. default false,  
    9. int default
    10. int default
    11. int default
    12. int default
    13. int default
    14. );