1首先先说一下问题;ckfinder组件的配置文件,几个对应的url;
<baseDir>/aaa/userfiles</baseDir>
<baseURL>127.0.0.1:22/img/</baseURL>
<sftpDir>img/</sftpDir>
sftpDir 为sftp上传文件的路径地址;
解决问题的思路是 在用户登录的时候,根据用户的id属性建立用户自己对应的文件夹目录,这样就可以把用户的图片分离开了;用户每次找的时候进入的是自己对应id的文件夹下的图片;
思路是这样但是问题如下;
1路径是配置文件配置好的,所以目前解决问题的方法是动态指定sftpDir地址;
首先想到问题的解决思路就是通过mxl 解析通过设置属性参数从新写回xml数据;但是看了项目目前的配置 ckfinder 的配置类是在项目启动的时候就加载的,于是看网上博文有没有解决方法,还确实有一个博文有思路,
思路如下;
在用户登录的时候 加载ckfinder.xml 配置文件 解析文件并写回文件, 然后就完了。。。。也是很无奈。只能自己想办法。
然后去官网 看到了java修改配置的方法;
自己写一个配置类继承Configuration;
复写其中的方法;我首先复写了init 方法,但是因为启动的时候没有用户信息,只执行一次 ,方案失败 ---总结失败原因对init方法理解不是很透彻;
然后又看到了一个方法;
createConfigurationInstance ,复写此方法可以创建Configuration对象;
可以在此过程中 读取ckfinder.xml配置文件信息,动态修改生成所需要的的Configuration对象,最后发现并没有成功,系统在启动的时候已经加载的配置文件 源码中的 private String sftpDir; 为私有属性,已经与xml中的属性配对,此时在修改已经没有作用;那有没有什么方法可以方位父对象的私有属性,此时的我想到了反射;
于是修改代码如下;
@Override
protected Configuration createConfigurationInstance() {
Principal principal = (Principal) UserUtils.getPrincipal();//用户信息
if (principal == null) {
return new CKFinderConfig(this.servletConf);
}
try {
Class<?> clazz=this.getClass().getSuperclass();
Field field=clazz.getDeclaredField("sftpDir");
field.setAccessible(true);
Object fieldValue = field.get(this);//文件路径
field.set(this,Global.basesftpDir+principal.getId()+"userImage"+"/");//设置用户相关的id文件夹路径
System.out.println(Global.basesftpDir+principal.getId()+"userImage"+"/");
//检测用户是否第一次登陆,第一次登陆创建服务器文件夹;
ChannelSftp connectIP = FtpUtils.getConnectIP();
boolean dirExist = FtpUtils.isDirExist(Global.basesftpDir+principal.getId()+"userImage"+"/", connectIP);
if(!dirExist){
FtpUtils.createDir(Global.basesftpDir+principal.getId()+"userImage"+"/", connectIP);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
CKFinderConfig a =new CKFinderConfig(this.servletConf);
return a;
};
问题的最终解决;
总结解决的过程和去掉不必要走的弯路;
1明确解决什么问题;
2初步设置解决问题的方案;
3熟悉插件在项目中的配置;
4熟悉插件的加载机制和配置方法;有必要的话debug源码了解其流程
5在配置方法和加载过程中插入自己所需要的逻辑;
6知识的运用 比如反射 xml解析等相关知识;
网友评论