apache ftpserver 可以加入自定的Ftplet來處理Ftp Event。
只要實作Ftplet interface 或 直接繼承DefaultFtplet。
再加入Ftplet到ftpserver,當Ftp command到來後就會自動呼叫對應的方法。
FtpServer ftpserver = new FtpServer();
ftpserver.setFtplets(getFtpletsMap());
ftpserver.start();
想使用DefaultFtplet來處理Ftp命令,可以override DefaultFtplet的onXXXStart方法。
卻找不到onListStart方法,來顯示檔案列表。
看了一下source code 發現DefaultFtplet的實作只是把beforeCommand根據,
request.getCommand()取得的命令來分支到其他方法,如下,
public FtpletResult beforeCommand(FtpSession session, FtpRequest request)
throws FtpException, IOException {
String command = request.getCommand().toUpperCase();
if ("DELE".equals(command)) {
return onDeleteStart(session, request);
} else if ("STOR".equals(command)) {
return onUploadStart(session, request);
} else if ("RETR".equals(command)) {
return onDownloadStart(session, request);
} else if ("RMD".equals(command)) {
return onRmdirStart(session, request);
} else if ("MKD".equals(command)) {
return onMkdirStart(session, request);
} else if ("APPE".equals(command)) {
return onAppendStart(session, request);
} else if ("STOU".equals(command)) {
return onUploadUniqueStart(session, request);
} else if ("RNTO".equals(command)) {
return onRenameStart(session, request);
} else {
// TODO should we call a catch all?
return null;
}
}
於是就可以自己重新override beforeCommand方法再增加LIST分支即可,
@Override
public FtpletResult beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException {
String command = request.getCommand().toUpperCase();
if ("LIST".equals(command)) {
return this.onListStart(session, request);
} else {
return super.beforeCommand(session, request);
}
}
沒有留言:
張貼留言