http://mina.apache.org/ftpserver/的框架可以很方便的建立一个ftp服务器。建立的方法和配置文件网上很多文章都有讲,也可以参考官网的document。
我就讲一下别人没讲的返回信息。
当客户端连到服务器进行上传下载的时候,服务器可以返回哪些信息呢?咱们就来研究一下这个吧。
在DefaultFtplet中提供了很多方法接口,用于在客户端连接、断开、上传下载时返回信息。具体的列表参考http://mina.apache.org/ftpserver/ftplet.html
我们先override其中的method.
先写一个类public static class MyFtplet extends DefaultFtplet {}
然后点击eclipse中的source-override/implement method。eclipse会把可以override的method全部列出来。
我们选择onConnect,onLogin,onUpLoadEnd,onDisconnect这四个基本的方法。勾选完之后点击“OK ",这些方法就自动override好了。
override之后的方法里面有一个参数是FtpSession session。下面看看这个参数中的一些常用功能。
session.getConnectionTime()
获取用户连接的时间
session.getFileSystemView()
获取当前服务器的文件结构,返回类型为FtpFile
session.getFileSystemView().getHomeDirectory()
获取服务器根目录路径,返回类型为FtpFile
session.getFileSystemView().getWorkingDirectory()
获取用户当前连接的目录路径,返回类型为FtpFile
session.getFileSystemView().getWorkingDirectory().getName()
获取用户当前连接的目录名字,返回类型为String
session.getFileSystemView().getWorkingDirectory().getAbsolutePath()
获取用户当前连接的目录的完整路径名字,返回类型为String(返回之后最后是没有斜杠的)。用这个可以获取用户文件的存放路径。
session.getLoginTime()
获取用户登录时间(这和连接时间是不同的概念)
方法中的另一个参数FtpRequest request
request.getArgument()
获取用户提交的命令中的参数,比如存储命令,这个参数就是文件名
request.getCommand()
获取用户提交的命令中的命令。比如存储的命令是"STOR"
request.getRequestLine()
获取用户提交的命令中的命令+参数
把当前路径和文件名加起来,就是完整的路径了。用这个路径也可以返回File型的文件。(filepath和file需要先定义)
public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println("transport complete"); //获取当前路径 String path = session.getFileSystemView().getWorkingDirectory().getAbsolutePath(); //获取上传的文件名(服务器文件名和客户端文件名相同) String filename = request.getArgument(); filepath = path+"/"+filename; file = new File(filepath); //返回上传文件的路径及文件名 System.out.println(filepath); return super.onUploadEnd(session, request); }
ftpserver-core-1.0.6.jar
mina-core-2.0.4.jar
ftplet-api-1.0.6.jar
以上jar包都在上面官网下载的文件中。