`
lenozhi
  • 浏览: 51022 次
社区版块
存档分类
最新评论

扩展 COMMON-NET和APACHE FTP SERVER命令

阅读更多

项目中使用apache ftp server提供文件接收服务,需要在文件接收完毕修改状态为:传输完毕。根据apache文档,只需实现FtpLet接口就可以实现命令执行前后的监控了。看了下APACHE FTP SERVER的源码,FtpLet的beforeCommand方法在Command执行前调用, afterCommand方法在Command执行后调用。那很清晰了,只要在afterCommand里监控ftp命令STOR和APPE就好了。但这里有个问题,server 端无法得知上传文件的大小,很郁闷。想想也对,只有客户端才关心这个问题,服务端只管存好了。那这里就有问题了,SERVER端无法判断文件是否上传完毕,原因:1. 文件大小不知,2.afterCommand方法即使客户端传输异常也会在关闭IO前调用。 只好扩展FTP 命令,增加FEND(文件传输完毕恭毕敬)命令,客户端成功上传后调用该命令:FEND FILENAME通知服务器该文件上传成功.同时在afterCommand中监控FEND 命令,取出文件名参数,然后在状态表中按文件名查询后,更新状态就好了.思路大该如此,下面说说具体要做哪些工作.

 

1.客户端修改内容,apache common-net包中,FTP包里修改:

    1 FTPCommand类,增加FEND命令

    2 FTP类, 增加fend(String fileName)方法,里面调用: sendCommand(FTPCommand.FEND,fileName)

    3 FtpClient类,增加sendFileComplete(String fileName)方法调用上面的fend命令,供客户端程序上传文件后调用。

 

2.apache ftp server端修改内容 这边有两种改法:

    方法1:不修改源码方法. 实现FEND命令, 使用CommandFactoryFactory中的addCommand动态添加新命令.

   

    2:修改源码方法: 实现FEND命令,修改CommandFactoryFactory,在里面的MAP中添加已实现的FEND命令. 实现FEND命令继承AbstractCommand

 

 3.实现自己的Ftplet,继承DefaultFtplet,实现方法

public FtpletResult onFend(FtpSession session, FtpRequest request) 覆盖

public FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply) throws FtpException, IOException {

 String command = request.getCommand().toUpperCase();
 if ( "FEND".equals(command)){ 
    return onFend(session, request); 
 }else{ 
    return super.afterCommand(session, request, reply); 
  } 
}

 

分享到:
评论
9 楼 lenozhi 2012-03-07  
catmimigo 写道
DefaultFtplet里不有很多时间通知吗?
	public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		System.out.println("transport complete");
		//session.write(new DefaultFtpReply(555, "Error!"));
		return FtpletResult.SKIP;
	}


时间通知?干啥用的
8 楼 catmimigo 2012-02-28  
DefaultFtplet里不有很多时间通知吗?
	public FtpletResult onUploadEnd(FtpSession session, FtpRequest request)
			throws FtpException, IOException {
		System.out.println("transport complete");
		//session.write(new DefaultFtpReply(555, "Error!"));
		return FtpletResult.SKIP;
	}
7 楼 lenozhi 2011-11-23  
wangrui 写道
客户端程序上传文件后直接发送RNTO(重命名命令)

好主意。后来又想了个法儿,发个一个空文件,主名相同,后缀改成OK。
6 楼 wangrui 2011-09-17  
客户端程序上传文件后直接发送RNTO(重命名命令)
5 楼 lenozhi 2010-12-31  
java_newclass_eye 写道
您好,请问如何将ftplet添加到ftpserver classpath 中才能下载ftplet?如何在浏览器中查看ftplet class 文件?非常感谢。

java_newclass_eye 写道
请问如何将ftplet添加到ftpserver classpath 中才能下载ftplet?如何在客户端浏览器中查看ftplet class 文件?非常感谢。

没看懂什么意思?ftplet可以在ftpserver网页上下载。
4 楼 java_newclass_eye 2010-12-20  
请问如何将ftplet添加到ftpserver classpath 中才能下载ftplet?如何在客户端浏览器中查看ftplet class 文件?非常感谢。
3 楼 java_newclass_eye 2010-12-20  
您好,请问如何将ftplet添加到ftpserver classpath 中才能下载ftplet?如何在浏览器中查看ftplet class 文件?非常感谢。
2 楼 lenozhi 2010-11-27  
yangtao22 写道
请教时间自己的Ftplet,继承DefaultFtplet,这个自己写的类如何才能生效呢?

配置如下:
  <ftplet name="LogFtplet">
    <beans:bean class="net.tscms.ftp.ftplet.LogFtplet">
  </ftplet>
     
这个配置文件还有其他内容,去官网看看。
1 楼 yangtao22 2010-11-18  
请教时间自己的Ftplet,继承DefaultFtplet,这个自己写的类如何才能生效呢?

相关推荐

Global site tag (gtag.js) - Google Analytics