Apache FtpServer是当下最热门的走ftp协议的用于用户上传下载的服务器。
 
一般来说,用的话,去官网下载完整的项目文件ftpserver-1.0.6.zip【windows版】和ftpserver-1.0.6.tar.gz【linux版】到本地,解压之后配置一下\ftpserver-1.0.6\apache-ftpserver-1.0.6\res\conf\下的users.properties或者ftpd-full.xml【主要看你走什么样的用户验证方式。users.properties:把用户信息配置在这个文件中。ftpd-full.xml:把用户信息配置在数据库中】
这样去bin目录下启动程序就好了。
 
但是Apache FtpServer从官方文档来看,都没有提及如何改变其中一些功能,只是解释一些它提供的标准功能。
这样对于企业级的应用来说,有些功能并不能满足现有的业务。
 
比如,我想限制每个ftp用户上传文件到他的文件目录下时,我想限制每个用户最多上传文件的总大小不超过50M。因为我不想被恶意用户弄爆我的服务器。我查阅了大量资料,发现标准的官方版里面是没有这样的功能的,在ftpd-full.xml和users.properties这里面也没有任何可以修改的参数来控制这样的业务。最后我决定自己通过编程来实现这样一个专门服务于我的这样的FtpServer。
我有这种想法的原因是,Apache FtpServer是纯java写的服务,而且提供了丰富的java接口。
 
查阅了大量资料后,还是找不到怎么用代码从jar里面启动整个server。
最后用反编译工具反编译整个Apache FtpServer项目后发现了,找到了启动的入口。
 public MyFtpServer() throws FtpException{

         //读取my-ftpd-full.xml,连接数据库和监控配置,然后来启动server
FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(xmlPath);
FtpServer server = null;
if (ctx.containsBean("server")) {
server = (FtpServer)ctx.getBean("server");
} else {
String[] beanNames = ctx.getBeanNamesForType(FtpServer.class);
if (beanNames.length == 1) {
server = (FtpServer)ctx.getBean(beanNames[0]);
} else if (beanNames.length > 1) {
logger.info("Using the first server defined in the configuration, named " + beanNames[0]);
server = (FtpServer)ctx.getBean(beanNames[0]);
} else {
logger.info("XML configuration does not contain a server configuration");
}
} //ftp服务器启动
server.start(); //在jvm关闭的时候,清理函数
addShutdownHook(server);
} /**
* 清理的垃圾的钩子函数
* @param engine
*/
private void addShutdownHook(final FtpServer engine)
{
Runnable shutdownHook = new Runnable() {
public void run() {
logger.info("Stopping server...");
engine.stop();
}
};
Runtime runtime = Runtime.getRuntime();
runtime.addShutdownHook(new Thread(shutdownHook));
}
配合上我的研究发现,提供的接口中可以在ftpd-full.xml中配置
 
 
    <ftplets>
<ftplet name="MyFtplet">
<beans:bean class="com.shiyi.km.ftpserver.control.MyFtplet">
<!-- <beans:property name="foo" value="123" /> -->
</beans:bean>
</ftplet>
</ftplets>
类似于监听器的东西,可以监听每个用户在上传或者下载的动作,在这些监听事件里面,我每次都去计算那个用户目录下面的文件size总大小,如果超过限制,就stop,并返回警告代码和消息给用户。

 import java.io.File;
import java.io.IOException; import org.apache.ftpserver.ftplet.DefaultFtpReply;
import org.apache.ftpserver.ftplet.DefaultFtplet;
import org.apache.ftpserver.ftplet.FtpException;
import org.apache.ftpserver.ftplet.FtpRequest;
import org.apache.ftpserver.ftplet.FtpSession;
import org.apache.ftpserver.ftplet.FtpletResult;
import org.apache.ftpserver.ftplet.User;
import org.apache.log4j.Logger; import com.shiyi.km.ftpserver.util.ConfigUtil;
import com.shiyi.km.ftpserver.util.FileUtil; /**
*
* @fileName MyFtplet.java
* @author chenkaideng
* @date 2015年8月11日
* @describe 监控事件
*/
public class MyFtplet extends DefaultFtplet{
private static final Logger logger = Logger.getLogger(MyFtplet.class); @Override
public FtpletResult onUploadStart(FtpSession session, FtpRequest request)
throws FtpException, IOException {
//获取用户信息
User user = session.getUser();
logger.info(String.format("用户信息,用户名【%s】,用户工作目录【%s】", user.getName(),user.getHomeDirectory()));
File file=new File(user.getHomeDirectory()); //判断传入对象是否为一个文件夹对象
if(!file.isDirectory()){
logger.info("用户的HomeDirectory不是一个文件夹,请检查路径是否有误!!");
}
else{
ConfigUtil configUtil = ConfigUtil.getInstance();
if(FileUtil.overSizeLimit(configUtil.getQuota(), file)){
logger.error(String.format("目前用户[%s]目录下的文件总大小超过配额!!!", user.getName()));
session.write(new DefaultFtpReply(228, "The files under the directory over quota"));
return FtpletResult.DISCONNECT;
}
}
return super.onUploadStart(session, request);
}
}
差不多整体的思路是这样的。
 
 
有了这些基础,还可以实现各种各样的不同需求,来管理用户目录或者一些其他的业务。

Apache FtpServer扩展【动手实现自己的业务】的更多相关文章

  1. springboot整合apache ftpserver详细教程(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/12192425.html,否则将追究法律责任!!! 一.Apache ftpserver相关 ...

  2. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  3. 01.Apache FtpServer配置

    1.解压Apache FTPServer 将下载下来的压缩包(ftpserver-1.0.6.zip)解压到本地,其目录结构如下图: 2.修改users.properties 修改 \apache-f ...

  4. apache FtpServer 整合spring部署

    我们在项目中可能会出现这样的需求,使用ftp上传很大的文件后对需要对文件进行相应的逻辑处理,这时我们可以使用apache ftpServer来处理这段逻辑,只要我们做相应的部署和编写我们的逻辑代码,这 ...

  5. apache FtpServer整合spring逻辑处理

    上面我们的部署工作完成了,那么文件上传下载后,ftpserver会自动相应我们的上传下载操作,也就是说ftpServer服务器会得到触发,那么我们如果要得到文件的一些信息,比如说文件的路径.大小.类型 ...

  6. Apache FtpServer 实现文件的上传和下载

    1 下载需要的jar包 Ftp服务器实现文件的上传和下载,主要依赖jar包为: 2 搭建ftp服务器 参考Windows 上搭建Apache FtpServer,搭建ftp服务器 3 主要代码 在ec ...

  7. (转载)Windows 上搭建Apache FtpServer

    因工作需要,最近经常接触到FTP,今天我来介绍一个开源的FTP服务器,那就是Apache FTPServer,Apache FTPServer是一个100%纯Java的FTP服务器. 它的设计是基于现 ...

  8. Apache和Tomcat整合(一个Apache 不同域名处理多个不同业务)

    一.简介 在项目中,几乎任何一个项目都包括静态资源和动态请求两大部分.特别对于门户网站这样的项目,静态内容资源会更多,我们使用一般的 Tomcat 部署时,Tomcat 对静态资源的处理能力比较慢,至 ...

  9. android学习:Android上面部署Apache FTPServer

    经过了几天的研究,终于Apache FTPServer在Android的配置和使用上有了一些心得,现在分享出来,提供给大家参考,说到这儿又不得不吐槽一下这要命的转载了,找Apache FTPServe ...

随机推荐

  1. linux下的php网站放到Windows服务器IIS下导入 .htaccess文件伪静态规则转换 (wordpress)

    需要特别注意的是: 1. .htacdess文件在 wordpress中 是可以生成的 安装 WP Super Cache后,开启该插件>>设置>>高级>>找到并点 ...

  2. 剑指offer系列30-----删除链表中重复的节点

    [题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...

  3. WSUS目录本地迁移

    生产环境中有一台win2003 server,安装了Microsoft Windows Server Update Services 3.0,作为所有windows server的内网补丁更新服务器, ...

  4. nsq的erlang客户端

    nsq是基于golang开发的分布式消息系统,这里仅仅贴个和erlang之间的通信demo rebar-creator create-app test_nsq rebar.config % -*- e ...

  5. 嵌入式设计模式:有限状态自动机的C语言实现

    转自:http://www.cnblogs.com/autosar/archive/2012/06/22/2558604.html 状态机模式是一种行为模式,在<设计模式>这本书中对其有详 ...

  6. 最小费用最大流 POJ2195-Going Home

    网络流相关知识参考: http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 出处:優YoU http://blog.csdn. ...

  7. 数据库随机取n条记录

    SQL Server SELECT TOP N  *  FROM  表名  ORDER BY  NEWID() My SQL  SELECT  *  FROM  表名 ORDER BY RAND() ...

  8. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  9. NeHe OpenGL教程 第九课:移动图像

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. LPC1768之GPIO

    在AHB总线上以便IO的高速操作,上电默认为输入高电平,支持GPDMA操作. 1只有GPIO0和GPIO2上的引脚能产生中断,/EXIT0~3特殊的外中断引脚. 2P0.29/0.30很特殊要么同为输 ...