springboot整合Ueditor步骤

    科技2022-07-10  139

    springboot整合Ueditor步骤

    前言1.下载Ueditor2.后台系统配置1)读取config配置。2)加入config.json 3.前端页面配置1)更改ueditor.config.js的部分代码2)更改ueditor.all.js的部分代码3)更改HTML中引入的富文本编辑器的js 4.遇到的问题1)后台上传图片成功,但是编辑器提示上传错误的原因2)jar包发布到线上后,读取不到config.json文件

    前言

    Ueditor是百度富文本编辑器,一款非常优秀的轻量级编辑器。工作中经常会用到Ueditor,如何整合Ueditor是个问题,尤其是上传图片更是令人头痛不已。所以将工作中整合Ueditor的方法写出来,仅供大家参考。 此次案例是将图片上传至图片服务器(已有上传文件接口),采用前后端分离的方式,未将图片保存至本地。

    1.下载Ueditor

    下载版本:dev-2.0.0 Ueditor下载地址:https://github.com/fex-team/ueditor#ueditor

    Ueditor官方文档:http://fex.baidu.com/ueditor/

    2.后台系统配置

    1)读取config配置。

    需要重新写一个controller,用于识别config的配置代码。 注意事项: ActionEnter类的使用,此处是上传图片保存成功的关键之处; "uploadimage"比对成功后执行上传图片操作,其他操作默认架在你配置项。

    代码示例如下:

    package com.cn.controller; import cn.hutool.core.text.UnicodeUtil; import com.cn.service.FileService; import com.alibaba.fastjson.JSONObject; import com.baidu.ueditor.ActionEnter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * @Author 奈何繁华如云烟 * @Description TODO * @Date 2020/9/10 18:16 */ @Slf4j @RestController public class UeditorController { @Autowired private FileService fileService; @RequestMapping("/ueditorConfig") public void ueditorConfig(HttpServletRequest request, HttpServletResponse response, MultipartFile upfile) { response.setContentType("application/json"); //配置config.json的位置 String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); log.info("rootPath: {}", rootPath); try { String exec = ""; String actionType = request.getParameter("action"); if("uploadimage".equalsIgnoreCase(actionType) && !upfile.isEmpty()){ // 做图片上传操作 exec = uploadImage(upfile); }else{ request.setCharacterEncoding( "utf-8" ); exec = new ActionEnter(request, rootPath).exec(); } log.info("exec: {}", UnicodeUtil.toString(exec)); response.getWriter().write(exec); } catch (IOException e) { log.error("UeditorController#config exception:",e); } } private String uploadImage(MultipartFile file) { JSONObject jsonResult = null; try { Map map = fileService.uploadFile(file); if (map == null) { jsonResult = new JSONObject(resultMap("文件上传失败","","","")); } else { String url = map.get("fileUrl").toString(); String fileName = map.get("originalFilename").toString(); String extraName = fileName.substring(fileName.lastIndexOf(".")); jsonResult = new JSONObject(resultMap("SUCCESS",url,fileName,fileName)); } } catch (Exception e) { log.error("UeditorController#uploadImage exception:",e); jsonResult = new JSONObject(resultMap("文件上传失败","","","")); } log.info("jsonResult: {}", jsonResult); return jsonResult.toString(); } //返回结果集 //{"state": "SUCCESS","original": "111.jpg","title": "1535961757878095151.jpg","url": "/1535961757878095151.jpg"} private Map<String,Object> resultMap(String state, String url, String title, String original){ Map<String ,Object> result = new HashMap<>(); result.put("state",state); result.put("url", url); result.put("title",title); result.put("original",original); return result; } }

    2)加入config.json

    从下载的Ueditor项目中找到config.json文件,并在resource目录下加入此文件。

    3.前端页面配置

    1)更改ueditor.config.js的部分代码

    直接更改Ueditor.config.js文件中的服务器端统一请求路径

    var URL = window.UEDITOR_HOME_URL || getUEBasePath(); //添加 // var server_url = window.location.protocol + "//"+window.location.hostname+":"+window.location.port; //可以改成远程服务器域名或IP var server_url = "http://127.0.0.1:8099" /** * * 配置项主体。注意,此处所有涉及到路径的配置别遗漏URL变量。 */ window.UEDITOR_CONFIG = { //为编辑器实例添加一个路径,这个不能被注释 UEDITOR_HOME_URL: URL // 服务器统一请求接口路径 , serverUrl: server_url + "/ueditorConfig"

    2)更改ueditor.all.js的部分代码

    因为单图上传,是为了兼容 低版本,使用了 表单提交到 iframe 的方式,不支持跨域,只能修改源码

    更改ueditor.all.js 第24568行,注释form提交的相关代码,并加入以下代码:

    // domUtils.on(iframe, 'load', callback); // form.action = utils.formatUrl(imageActionUrl + (imageActionUrl.indexOf('?') == -1 ? '?':'&') + params); // form.submit(); var formdata = new FormData(form); var arr,reg=new RegExp("(^| )_token=([^;]*)(;|$)"); var myForm = document.getElementById("myForm"); var xhr= new XMLHttpRequest(); xhr.open("POST", me.getOpt('serverUrl')+'?action=uploadimage', true); xhr.onreadystatechange = function() { if (xhr.readyState === 4) if ((xhr.status >=200 && xhr.status < 300) || xhr.status == 304) alert(xhr.responseText); } xhr.send(formdata); xhr.onreadystatechange = function () { if(xhr.readyState == 4) { var response = JSON.parse(xhr.responseText); if(response.state=='SUCCESS' ){ loader = me.document.getElementById(loadingId); loader.setAttribute('src', response.url); loader.setAttribute('_src', response.url); loader.setAttribute('title', response.title || ''); loader.setAttribute('alt', response.original || ''); loader.removeAttribute('id'); domUtils.removeClasses(loader, 'loadingclass'); } } }

    3)更改HTML中引入的富文本编辑器的js

    引用的ueditor.all.min.js 改为ueditor.all.js

    4.遇到的问题

    1)后台上传图片成功,但是编辑器提示上传错误的原因

    有可能是跨域问题,需要后台加入全局过滤器,支持跨域访问。代码如下:

    /** * @Author 奈何繁华如云烟 * @Description TODO 全局过滤器,支持跨域 * @Date 2020/9/11 15:24 */ @Component public class ServletFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }

    2)jar包发布到线上后,读取不到config.json文件

    因为ConfigManager中读取config.json文件,是使用的File流,发布到线上后由于本地和服务器的路径配置不同会出现无法读取的现象。所以需要更改ConfigManager中的initEnv()方法,以适配线上应用。修改读取文件的方式为:

    //原读取方式 private void initEnv () throws FileNotFoundException, IOException { File file = new File( this.originalPath ); if ( !file.isAbsolute() ) { file = new File( file.getAbsolutePath() ); } this.parentPath = file.getParent(); String configContent = this.readFile( this.getConfigPath() ); try{ JSONObject jsonConfig = new JSONObject( configContent ); this.jsonConfig = jsonConfig; } catch ( Exception e ) { this.jsonConfig = null; } } //修改后读取方式 private void initEnv() throws FileNotFoundException, IOException { File file = new File(this.originalPath); if (!file.isAbsolute()) { file = new File(file.getAbsolutePath()); } this.parentPath = file.getParent(); String configContent = this.filter(IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("config.json"))); try { JSONObject jsonConfig = JSON.parseObject(configContent); this.jsonConfig = jsonConfig; } catch (Exception var4) { this.jsonConfig = null; } }

    以上内容仅是一次经验总结,并未深入研究其中的原因,希望可以对阅读到此文章的同学有所帮助。

    Processed: 0.019, SQL: 8