最近在写一个项目,需要用到FTP服务,就从网上搜了一下,发现Apache Ftp Server相对来说使用方便,性能稳定,效率高,且该服务器是开源免费的,而且该服务器与spring容器可以无缝的融合到一起,下面是我写的一个例子,供有需要的参考。
第一步:下载jar包,拷贝到项目的lib目录下,jar包请参照附件
第二步:添加配置文件ftpserver.xml,具体内容如下:
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获取的
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配置文件中,代码如下:
1. <!-- 导入FTP SERVER配置 -->
2. <import resource="classpath:/ftpserver.xml"/>
第三步:拷贝ftpserver.jks文件到src目录,该文件在apache-ftpserver-1.0.6\res目录下
第四步:建立FTP服务监听类FtpServerListener,代码如下:
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中配置该监听器,代码如下:
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接口,代码如下:
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用户表结构如下:
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. );