SpringBoot下thymeleaf使用UEditor

简介: 以前传统web工程下使用UEditor是继承ActionEnter实现自己的MyActionEnter来实现自定义文件上传路径的

以前传统web工程下使用UEditor是继承ActionEnter实现自己的MyActionEnter来实现自定义文件上传路径的


本文主要是SpringBoot+thymeleaf环境下使用UEditor。

【1】本地环境下不指定上传路径

① 引入pom依赖

<!-- 百度编辑器 -->
<dependency>
  <groupId>com.gitee.qdbp.thirdparty</groupId>
  <artifactId>ueditor</artifactId>
  <version>1.4.3.3</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>


② 下载UEditor的jsp版本


UEditor官网:https://ueditor.baidu.com/website/index.html


下载地址:https://ueditor.baidu.com/website/download.html


从官网或者其他地方下载下来,然后放入如下路径 /static/common/plugs/ueditor:


当然可以选择其他路径,这里以这个路径为参考。如果你放到其他地方,那么本文描述的其他细节请自行对应修改。

② 修改\static\common\plugs\ueditor\ueditor.config.js


③ 自定义UeditorController

稍微解释下,这里controller拦截的请求/common/plugs/ueditor/jsp/controller其实就是②中ueditor.config.js的serverUrl。

@Controller
@RequestMapping("/common/plugs/ueditor/jsp")
public class UeditorController {
    @RequestMapping("/controller")
    @ResponseBody
    public void getConfigInfo(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("application/json");
        String rootPath = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static";
        System.out.println("rootPath:" + rootPath);
        try {
            String exec = new ActionEnter(request, rootPath).exec();
            System.out.println("exec:" + exec);
            PrintWriter writer = response.getWriter();
            writer.write(exec);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


为什么要这么做呢?跟踪其源码可以发现它是根据this.rootPath, this.contextPath, configPath获取配置管理器的—对应config.json。

如果遇到诸如:配置文件初始化失败错误就是config.json拿不到!


com.baidu.ueditor.ActionEnter:

 public ActionEnter(IStorageManager storage, HttpServletRequest request, String rootPath, String configPath) {
        this.request = null;
        this.rootPath = null;
        this.contextPath = null;
        this.actionType = null;
        this.configManager = null;
        this.storage = storage;
        this.request = request;
        this.rootPath = rootPath;
        this.actionType = request.getParameter("action");
        this.contextPath = request.getContextPath();
        if (configPath == null) {
            configPath = request.getParameter("configPath");
            if (configPath == null) {
                configPath = request.getRequestURI();
            }
        }
        this.configManager = ConfigManager.getInstance(this.rootPath, this.contextPath, configPath);
    }

也就是说,如果你参数中没有传configPath,那么它将自动获取request.getRequestURI();–在这里也就是/common/plugs/ueditor/jsp/controller。继续再跟下ConfigManager.getInstance源码如下:

 private ConfigManager(String rootPath, String contextPath, String uri) throws FileNotFoundException, IOException {
        rootPath = rootPath.replace("\\", "/");
        this.rootPath = rootPath;
        if (contextPath.length() > 0 && uri.startsWith(contextPath)) {
            this.originalPath = this.rootPath + uri.substring(contextPath.length());
        } else {
            this.originalPath = this.rootPath + uri;
        }
        this.initEnv();
    }

这里也就明朗了,UEditor就是根据originalPath获取到config.json!如果拿不到这玩意,就会报配置错误!

所以其实这中间可操作的地方还有,可以在controller方法中放入configPath!

完成后界面如下:



上传的图片为止如下图所示:

【2】项目打jar部署到服务器

① config.json读取问题

按照【1】配置,这时拿不到config.json。


修改controller如下:

/**
 * 这里contextPath为空!
 */
@Controller
@RequestMapping("/common/plugs/ueditor/jsp")
public class UeditorController {
    private static  final Logger logger= LoggerFactory.getLogger(UeditorController.class);
    @Value("${com.jane.configjson.baseFilePath}")
    private String configJsonPath;
    @RequestMapping("/controller")
    @ResponseBody
    public void getConfigInfo(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("application/json");
        logger.debug("配置文件配置的configJsonPath:"+configJsonPath);
        String requestURL = request.getRequestURL().toString();
        logger.debug("requestURL:"+requestURL);
        logger.debug("RequestURI:"+request.getRequestURI());
        logger.debug("ContextPath:"+request.getContextPath());
        String rootPath = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static";
        String configPath=request.getRequestURI();
        if(requestURL.contains("127.0.0.1")||requestURL.contains("localhost")||requestURL.contains("192.168")){
            logger.debug("本地环境");
        }else{
            rootPath=configJsonPath;
            configPath="/test";//这里随便写
            logger.debug("服务器环境,请将config.json放到"+rootPath+"的下面!");
        }
        logger.debug("rootPath:" + rootPath);
        /**
         * 1.如果ContextPath为空,则rootPath+RequestURI的父级决定config.json位置
         * 2.如果ContextPath为空不为空 originalPath = this.rootPath + uri.substring(contextPath.length());
         * originalPath.getParentFile()+config.json即为最终完整config.json路径
         */
        try {
            String exec = new ActionEnter(new StorageManager(), request, rootPath, configPath).exec();
            System.out.println("exec:" + exec);
            PrintWriter writer = response.getWriter();
            writer.write(exec);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后将config.json放到配置文件中${com.jane.configjson.baseFilePath}的下面:

这个路径就是项目跑的路径:

但是此时还有另外一个问题,图片不能回显!


② 解决图片回显问题

图片上传成功,但是回显不了!

那么这时候就要搞清楚,图片到底保存到了哪里?


继续跟踪源码,图示如下:

很明显了,图片最终路径是rootPath+savePath!rootPath就是我们在controller传进去的,savePath就是UEditor从config.json读取imagePathFormat的值!


服务器验证如下:

而图片回显请求则是savePath+实际保存的文件名!那么很好说了,自定义controller拦截/ueditor/jsp/upload前缀的请求进行文件下载处理即可!


第一步-修改UeditorController

exec方法执行结束后是返回一个json字符串,那么就可以从中对url进行替换。

 String exec = new ActionEnter(new StorageManager(), request, rootPath, configPath).exec();
            /**
             * exec:{"state": "SUCCESS","original": "\u5b9e\u9a8c\u75301.jpg","size": "42389","title": "1580809982781059908.jpg",
             * "type": ".jpg","url": "/ueditor/jsp/upload/image/20200204/1580809982781059908.jpg"}
             */
            System.out.println("exec:" + exec);
            JSONObject parse = JSON.parseObject(exec);
            if(parse.containsKey("url")){
                String oldUrl = parse.getString("url");
                String urlNew="/ueditor/jsp/upload?filePath="+oldUrl;
                parse.put("url",urlNew);
                logger.debug("封装后的exec:"+parse);
            }

第二步-自定义fileController处理上面的urlNew

  @Value("${com.jane.configjson.baseFilePath}")
    private String configJsonPath;
  @RequestMapping("/ueditor/jsp/upload")
    public ResponseEntity<byte[]> ueditorfileDown(HttpServletRequest request,String filePath){
        logger.debug("filePath:"+filePath);
        byte [] body = null;
        String rootPath = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static";
        String requestURL = request.getRequestURL().toString();
        if(requestURL.contains("127.0.0.1")||requestURL.contains("localhost")||requestURL.contains("192.168")){
            logger.debug("本地环境");
        }else{
            rootPath=configJsonPath;
        }
        String fileUrl=rootPath+ File.separator+filePath;
        try {
            //获取到文件流
            InputStream in = new FileSystemResource(fileUrl).getInputStream();
            body = new byte[in.available()];
            in.read(body);
        } catch (IOException e1) {
            logger.debug("文件读入出错,文件路径为:"+fileUrl);
            e1.printStackTrace();
        }
        int index = filePath.lastIndexOf("/");
        String fileName = filePath.substring(index+1);
        logger.debug("本次下载的文件为:"+fileName);
        //添加响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment;filename="+fileName);
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        HttpStatus statusCode = HttpStatus.OK;
        ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
        return response;
    }

最终效果如下图所示:


【3】指定文件上传路径与回显


其实,只要【2】弄清楚了,指定文件上传路径并回显就很简单了。核心要点:rootPath,configPath,savePath以及config.json配置内容!

这里不再赘述!

目录
相关文章
|
6月前
|
XML 前端开发 Java
Springboot整合freemarker
Springboot整合freemarker
|
6月前
|
XML JavaScript 前端开发
SpringBoot整合Freemarker使用
SpringBoot整合Freemarker使用
46 0
|
缓存 Java
springboot整合thymeleaf
springboot整合thymeleaf
232 0
|
Java
15 SpringBoot模板引擎
15 SpringBoot模板引擎
57 0
|
移动开发 缓存 前端开发
SpringBoot整合thymeleaf
SpringBoot整合thymeleaf
123 0
SpringBoot整合thymeleaf
|
Java Android开发
SpringBoot入门:SpringBoot整合Freemarker和Thymeleaf模板
关于springboot项目的创建可以看下面这篇文章,这里不进行叙述,可以参考之前的文章SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目。
179 0
SpringBoot入门:SpringBoot整合Freemarker和Thymeleaf模板
|
XML 移动开发 前端开发
Springboot整合Thymeleaf
Springboot整合Thymeleaf
172 0
|
Java Spring
SpringBoot 整合 Thymeleaf
jsp输出页面是通过 response.getWriter().write 去一点一点写会给浏览器,效率低,我们也发现了这个问题,于是,在 SpringBoot 中提倡使用一种新的视图解析,他就是 Thymeleaf,他是把整个 HTML 页面直接返回,效率高,使用方式就是先在 pom.xml 中引入 spring-boot-starter-thymeleaf 坐标,然后配置下视图解析器,和 jsp 的视图解析器类似,之后就可以使用了,非常简单
136 0
SpringBoot 整合 Thymeleaf