ckfinder connector java适配ftp
- 简介
ckfinder是一个文件管理器,包含多种语言(java、php、.net)的后端适配器及web管理界面,功能比较全面。目前java版的connector只支持本地文件系统的文件管理,由于项目需要,文件存储在远程ftp服务器中,因此需要对java版的connector进行ftp扩展。
- ckfinder文件模型
- backend
文件仓库
- resourceType
资源目录
- workingfolder
当前目录
- file
文件、图片、缩略图
- 源码分析
ckfinder文件管理流程
虽然图示如此,但是java版的connector并没有ftp的抽象层(个人并没有找到,网上也没有相关实现),java版的connector基于filesystem、filesystemprovider相关接口,基于此来实现ftp抽象层,个人觉得比较复杂(文件系统接口功能太多,涉及的必要实现也非常多),最终放弃该方案。
再来分析下connector中的请求生命周期:
经分析,发现所有的前端请求最终都会找到对应的command实现来执行,而command就是具体文件操作逻辑。那么好了,只要我们改写所有的command实现为适配ftp的command就可以满足我们的要求了。在改造完后,功能基本都可用。
接下来列出核心的改造内容:
1、自定义ResolveCommandEvent监听器CustomResolveCommandListener,在该监听器中,返回自定义的command
2、自定义AfterCommandEvent监听器AddCurrentFolderListener(重写自AddCurrentFolderInfoEventListener)。
3、定义BeanPostProcessor的实现类LocalProcessor,重写postProcessBeforeInitialization方法,在该方法中,移除名为AddCurrentFolderInfoEventListener的bean实例(该bean会调用文件系统相关服务,因此需要重写),添加AddCurrentFolderListener的bean实例。
4、自定义WorkingFolder实现类。
5、自定义Command,重写handle方法,基于自定义的WorkingFolder方法来实现ftp文件操作。
原workingFolder是command的目录对象,其封装了基于当前目录的一些文件操作方法,包括目录名称、目录权限校验、获取目录文件列表等等。
- 回顾
在改造完成后,发现ckfinder connector的核心逻辑基本都是自己实现的,工作量还是蛮大的。 针对于ckfinder的connector的改造,我们沿用了他的文件模型、权限控制逻辑、请求处理流程。我们改造的内容是:command的自定义解析、command的执行逻辑、aftercommand监听的执行逻辑。
- 问题及待完善功能
1、文件系统connector与ftpconnector无法共存,需要针对不同的backend匹配不同的command及afftercommand监听进行逻辑开发。
2、对于ftp的权限控制、操作正确性、可靠性还有待完善及验证,需要对ftp连接资源进行管理限制。
3、针对缩略图的改造还未完成。