美文网首页程序员
ckfinder解决不同用户不同文件夹上传的解决过程

ckfinder解决不同用户不同文件夹上传的解决过程

作者: 晴天M雨天 | 来源:发表于2020-04-04 00:00 被阅读0次

    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解析等相关知识;

    相关文章

      网友评论

        本文标题:ckfinder解决不同用户不同文件夹上传的解决过程

        本文链接:https://www.haomeiwen.com/subject/yylrphtx.html