最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多java版本的资料,不过大部分都是前后端都在一个工程项目下,页面是jsp的。由于我这个系统是把前后端拆分开成前后端分离的。所以在根据看了网上的资料以及慢慢的摸索下,实现了在前后端分离的情况下把ueditor集成到系统中。项目页面如图:

说明:由于ueditor的上传文件的功能默认是上传在项目工程目录下的,而我这里是把文件上传到另外一个Tomcat服务器下的,所以我自己单独写了一个上传接口,并且还要修改config.json文件。

现在为了记录ueditor的使用,我在这里把有关ueditor这一块单独拿出来,写了一个简单的小demo,下面记录过程,如有不足之处,敬请提出。

1、下载ueditor

打开http://ueditor.baidu.com/website/download.html#ueditor

需要下载两个压缩包

1、下载完整源码,并解压

2、下载jsp版本【UTF-8】,并解压

  源码版本是为了使用里面的java文件,而后来发现在源码版本中没有ueditor.all.min.js文件,而在前端是需要引入这个js文件的,所以需要再把jsp版本下载下来,该版本中有该js文件。

      

2、java后台部分

2.1、config.json文件

在java项目的 src/main/webapp 目录下新建一个conf目录,然后在解压后的源码版本中的 jsp 目录下找到config.json文件,把它复制到新建的conf目录下,并做修改。

该文件是用来配置ueditor编辑器的上传文件的功能的各种参数的。

其中,imageActionName属性的取值“uploadimage”要记住,后续上传接口中要用到

2.2、把源码版本中的 jsp/src/com 目录下的 baidu 这个文件夹拷贝到项目com.lin包下

  拷贝后,里面java文件肯定会报错,只需修改各个java文件的package包路径和引用其他文件的路径即可。

 另外由于在上一步中,把config.json文件放置到了src/main/webapp/conf目录下,而在ConfigManager类中需要读取该json文件的内容,所以需要在ConfigManager.java文件中修改少量代码,大于在170多行,修改如下:

2.3、项目常量配置-config.properties

  1. #host地址
  2. host=http://172.16.4.160:8081/ssm_project
  3. #文件上传服务器地址(ip+端口)
  4. uploadHost=http://172.16.4.160:8090/
  5. #普通图片上传保存目录
  6. imagePath = file/image/
  7. #系统用户头像上传保存目录
  8. headImgPath = file/image/headImg/
  9. #系统用户默认头像
  10. sysUserDefImg = sysUser-default.jpg
  11. #文本文件上传保存目录
  12. documentPath = file/document/
  13. #音频文件上传保存目录
  14. soundPath = file/sound/
  15. #视频文件上传保存目录
  16. videoPath = file/video/
  17. #ueditor编辑器上传文件保存目录(包括图片、视频、音频、文本等文件)
  18. ueditor = file/ueditor/

2.4、新建上传工具类-Upload.java

该文件其实在我11月2号的博客——前后端分离跨服务器文件上传-Java SpringMVC版 中已有,为了方便理解,这里再次把代码贴出来。

  1. package com.lin.utils;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Date;
  7. import java.util.UUID;
  8.  
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. import org.apache.commons.io.FilenameUtils;
  13. import org.springframework.web.multipart.MultipartFile;
  14.  
  15. import com.sun.jersey.api.client.Client;
  16. import com.sun.jersey.api.client.WebResource;
  17.  
  18. /**
  19. * 上传文件工具类
  20. * @author libo
  21. */
  22. public class Upload {
  23.  
  24. /**
  25. * 上传文件
  26. * @param request
  27. * @param response
  28. * @param serverPath 服务器地址:(http://172.16.5.102:8090/)
  29. * @param path 文件路径(不包含服务器地址:upload/)
  30. * @return
  31. */
  32. public static String upload(Client client, MultipartFile file, HttpServletRequest request,HttpServletResponse response, String serverPath, String path){
  33. // 文件名称生成策略(日期时间+uuid )
  34. UUID uuid = UUID.randomUUID();
  35. Date d = new Date();
  36. SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
  37. String formatDate = format.format(d);
  38. // 获取文件的扩展名
  39. String extension = FilenameUtils.getExtension(file.getOriginalFilename());
  40. // 文件名
  41. String fileName = formatDate + "-" + uuid + "." + extension;
  42. //相对路径
  43. String relaPath = path + fileName;
  44.  
  45. String a = serverPath + path.substring(0, path.lastIndexOf("/"));
  46. File file2 = new File(a);
  47. if(!file2.exists()){
  48. boolean mkdirs = file2.mkdirs();
  49. System.out.println(mkdirs);
  50. }
  51.  
  52. // 另一台tomcat的URL(真实路径)
  53. String realPath = serverPath + relaPath;
  54. // 设置请求路径
  55. WebResource resource = client.resource(realPath);
  56.  
  57. // 发送开始post get put(基于put提交)
  58. try {
  59. resource.put(String.class, file.getBytes());
  60. return fileName+";"+relaPath+";"+realPath;
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. return "";
  64. }
  65. }
  66.  
  67. }

2.5、新建UEditorController.java文件,编写上传接口

  1. package com.lin.controller;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.util.Map;
  6.  
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. import org.apache.commons.io.FilenameUtils;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestMethod;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import org.springframework.web.multipart.MultipartFile;
  17. import org.springframework.web.multipart.MultipartHttpServletRequest;
  18. import org.springframework.web.multipart.MultipartResolver;
  19. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  20.  
  21. import com.lin.baidu.ueditor.ActionEnter;
  22. import com.lin.utils.ResponseUtils;
  23. import com.lin.utils.Upload;
  24. import com.sun.jersey.api.client.Client;
  25.  
  26. import net.sf.json.JSONObject;
  27. /**
  28. * baidu-ueditor
  29. * @author libo
  30. */
  31. @Controller
  32. @RequestMapping("/ueditor")
  33. public class UEditorController {
  34. @Value(value="${ueditor}") //后台图片保存地址
  35. private String ueditor;
  36.  
  37. @Value(value="${uploadHost}")
  38. private String uploadHost; //项目host路径
  39.  
  40. /**
  41. * ueditor文件上传(上传到外部服务器)
  42. * @param request
  43. * @param response
  44. * @param action
  45. */
  46. @ResponseBody
  47. @RequestMapping(value="/ueditorUpload.do", method={RequestMethod.GET, RequestMethod.POST})
  48. public void editorUpload(HttpServletRequest request, HttpServletResponse response, String action) {
  49. response.setContentType("application/json");
  50. String rootPath = request.getSession().getServletContext().getRealPath("/");
  51.  
  52. try {
  53. if("config".equals(action)){ //如果是初始化
  54. String exec = new ActionEnter(request, rootPath).exec();
  55. PrintWriter writer = response.getWriter();
  56. writer.write(exec);
  57. writer.flush();
  58. writer.close();
  59. }else if("uploadimage".equals(action) || "uploadvideo".equals(action) || "uploadfile".equals(action)){ //如果是上传图片、视频、和其他文件
  60. try {
  61. MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
  62. MultipartHttpServletRequest Murequest = resolver.resolveMultipart(request);
  63. Map<String, MultipartFile> files = Murequest.getFileMap();//得到文件map对象
  64. // 实例化一个jersey
  65. Client client = new Client();
  66.  
  67. for(MultipartFile pic: files.values()){
  68. JSONObject jo = new JSONObject();
  69. long size = pic.getSize(); //文件大小
  70. String originalFilename = pic.getOriginalFilename(); //原来的文件名
  71. String uploadInfo = Upload.upload(client, pic, request, response, uploadHost, ueditor);
  72. if(!"".equals(uploadInfo)){ //如果上传成功
  73. String[] infoList = uploadInfo.split(";");
  74. jo.put("state", "SUCCESS");
  75. jo.put("original", originalFilename);//原来的文件名
  76. jo.put("size", size);  //文件大小
  77. jo.put("title", infoList[1]);  //随意,代表的是鼠标经过图片时显示的文字
  78. jo.put("type", FilenameUtils.getExtension(pic.getOriginalFilename()));  //文件后缀名
  79. jo.put("url", infoList[2]);//这里的url字段表示的是上传后的图片在图片服务器的完整地址(http://ip:端口/***/***/***.jpg)
  80. }else{ //如果上传失败
  81. }
  82. ResponseUtils.renderJson(response, jo.toString());
  83. }
  84. }catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. }
  88. } catch (Exception e) {
  89. }
  90. }
  91. }

其中:

  1. if("config".equals(action)){
    这段代码是用来判断是否是初始化上传的,因为在点击多图上传弹出上传窗口的时候,是会请求这个接口,经测试,如果没有该段判断,前端的上传是无法使用的。

   else if("uploadimage".equals(action) || "uploadvideo".equals(action) || "uploadfile".equals(action)){ 

这一部分代码判断中, uploadimage,uploadvideo,uploadfile 这三个值,都是来自于conf.json文件中的配置,因此这一个接口既可以上传图片,也可以上传其他类型文件。

另外接口返回的json字段,也是固定的。

3、前端部分

3.1、demo目录结构

在ueditor-demo目录下新建lib目录,然后从之前解压的jsp版本中,把dialogs、lang、themes、third-party四个文件夹和ueditor.all.min.js、ueditor.config.js、ueditor.parse.js、ueditor.parse.min.js四个js文件复制到lib目录下,并添加jQuery(用来执行ajax提交数据)

3.2、文件修改

1、修改ueditor.config.js

修改服务器统一请求接口路径 - serverUrl属性的值修改为后台上传文件的接口地址

2、修改dialogs/image/image.js、dialogs/video/video.js、dialogs/attachment/attachment.js三个文件

这三个文件分别对应图片上传、视频上传、附件上传,主要是要去掉默认设置的请求头(可以直接在这三个js文件中删掉该段代码),否则无法上传文件

2.1、dialogs/image/image.js大概在706行

2.2、dialogs/video/video.js大概在719行

2.3、dialogs/attachment/attachment.js大概在488行

3.3、index.html

在页面中需要引入ueditor.config.js、ueditor.all.min.js和zh-cn.js

在body元素中写一个script元素,给一个id,这里为editor,并设置type="text/plain",这个id主要是通过它来初始化ueditor实例的。

初始化的方式是在通过 UE.getEditor('script标签id', {})。

这里有两个参数,第一个参数是script标签的id值,第二个参数是一个对象,可以用来设置ueditor编辑框的宽高等属性,这里只设置了宽高。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>ueditor-demo</title>
  6. <script src="/lib/jquery.min.js"></script>
  7. <script src="/lib/ueditor/ueditor.config.js"></script>
  8. <script src="/lib/ueditor/ueditor.all.min.js"></script>
  9. <script src="/lib/ueditor/lang/zh-cn/zh-cn.js"></script>
  10. <style>
  11. #submit {
  12. width: 100px;
  13. height: 30px;
  14. line-height: 30px;
  15. font-size: 16px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <h2>ueditor测试使用</h2>
  21. <script id="editor" type="text/plain"></script>
  22. <div style="margin-top: 20px; text-align: center;">
  23. <input type="button" class="btn btn-blue w-100" value="提 交" id="submit">
  24. </div>
  25.  
  26. <script>
  27.  
  28. $(function () {
  29. //实例化编辑器
  30. var ue = UE.getEditor('editor',{
  31. initialFrameWidth:"100%", //初始化宽度
  32. initialFrameHeight:400, //初始化高度
  33. });
  34.  
  35. $('#submit').click(function () {
  36. //获取ueditor编辑框中的html文本内容
  37. var content = UE.getEditor('editor').getContent();
  38. $.ajax({
  39. url: 'http://172.16.4.160:8081/ssm_project/news/addNews.do',
  40. type: 'POST',
  41. data: {
  42. content: content,
  43. },
  44. dataType: 'json',
  45. success: function (res) {
  46. console.log(res);
  47. },
  48. error: function () {
  49. console.log(res);
  50. }
  51. })
  52. })
  53. })
  54.  
  55. </script>
  56. </body>
  57.  
  58. </html>

UE.getEditor('editor').getContent()方法就可以获取到编辑框中的html文本,然后调用添加接口,就可以把html格式的文本保存到数据库中了。

此时就可以在服务环境下访问该index.html页面,即可看到ueditor富文本编辑框,并进行上传文件并保存到数据库中。

4、效果

上传接口返回的json格式如下:

存放到数据库的为html结构的文本,如图:

注意:在测试之前,需要先启动文件服务器——另外一个Tomcat服务器 ,至于关于这一块的介绍,请参考11月2号的一篇博客:前后端分离跨服务器文件上传-Java SpringMVC版

由于本人是做web前端开发的,只是最近在学学java,因此项目或者demo中都有很多不足之处。如若大家有建议,欢迎在评论区提出。

需要购买阿里云产品和服务的,点击此链接领取优惠券红包,优惠购买哦,领取后一个月内有效: https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=fp9ccf07

前后端分离ueditor富文本编辑器的使用-Java版本的更多相关文章

  1. ASP.NET MVC5 中百度ueditor富文本编辑器的使用

    随着网站信息发布内容越来越多,越来越重视美观,富文本编辑就是不可缺少的了,众多编辑器比较后我选了百度的ueditor富文本编辑器. 百度ueditor富文本编辑器分为两种一种是完全版的ueditor, ...

  2. ueditor富文本编辑器使用百度地图自定义动态地图组件及兼容https及http协议

    ueditor富文本编辑器默认支持百度地图组件,但是如果导入动态地图后会加很多默认的地图组件在上面.如果需要自定义动态地图的组件则需要修改ueditor特定的html. ueditor百度地图组件所在 ...

  3. UEditor富文本编辑器简单使用

    UEditor富文本编辑器简单使用 一.下载地址:https://ueditor.baidu.com/website/ 官网中并没有 python 版本的 UEditor 富文本编辑器,本文简单介绍 ...

  4. MVC 使用 Ueditor富文本编辑器

    一.Ueditor 1.下载Ueditor富文本编辑器 官方下载地址: http://ueditor.baidu.com/website/download.html 建议下载开发版,此处我下载的是 . ...

  5. 百度ueditor富文本编辑器的使用

    百度ueditor富文本编辑器的使用 //以下为我在官网下载的ueditor v1.3.5 php版的大楷配置步骤第一步: //配置文件的引入应该比功能文件先引入,最后设置语言类型.即:editor. ...

  6. PHP如何搭建百度Ueditor富文本编辑器

    本文为大家分享了PHP搭建百度Ueditor富文本编辑器的方法,供大家参考,具体内容如下 下载UEditor 官网:下载地址 将下载好的文件解压到thinkphp项目中,本文是解压到PUBLIC目录下 ...

  7. WEB项目中使用UEditor(富文本编辑器)

    Ueditor富文本编辑器是在很多项目里经常用到的框架,是百度开发团队开发的一款很好用的富文本编辑器 下面就是我在一个系统里用到的,有了富文本编辑器,管理员使用起来不是很方便? 所以本博客介绍这个富文 ...

  8. django之百度Ueditor富文本编辑器后台集成

    Python3 + Django2.0 百度Ueditor 富文本编辑器的集成 百度富文本编辑器官网地址:http://fex.baidu.com/ueditor/ 疑问:为什么要二次集成? 答案:因 ...

  9. springMVC -- 整合UEditor(富文本编辑器)

    工作中需要用到UEditor编辑文本,在与springMVC进行整合时,出现了一些问题,结果导致,在进行图片上传时出现如下提示: 上网查询了很多相关资料,此处简要记录下,防止以后遇到类似问题. 一种方 ...

随机推荐

  1. 我两年的web开发生涯

    我两年的web开发生涯 与以前的文章分享给大家自己的知识和观点不同,这篇文章更多的是写给自己的总结. 现在是 2017年10月18. 从 2015年9月 开始接触前端开发,至今两年零一个月. 从 20 ...

  2. Vocabulary & Phrase

    Vocabulary A ANSI    美国国家标准学会,American National Standards Institute的缩写 a couple of    [口语]少数的,几个 a s ...

  3. 通过 Visual Studio 的“代码度量值”来改进代码质量

    1 软件度量值指标 1.1 可维护性指数 表示源代码的可维护性,数值越高可维护性越好.该值介于0到100之间.绿色评级在20到100之间,表明该代码具有高度的可维护性:黄色评级在10到19之间,表示该 ...

  4. 使用一个for循环将N*N的二维数组的所有值置1

    <?php // 使用一个for循环将N*N的二维数组的所有值置1 $n = ; $a = []; ;$i<$n*$n;$i++){ $a[$i/$n][$i%$n] = ; } prin ...

  5. CSS实现模糊效果

    HTML代码如下: <body> <h1>body设置了模糊效果</h1> <div id="aa"></div> &l ...

  6. 《java.util.concurrent 包源码阅读》06 ArrayBlockingQueue

    对于BlockingQueue的具体实现,主要关注的有两点:线程安全的实现和阻塞操作的实现.所以分析ArrayBlockingQueue也是基于这两点. 对于线程安全来说,所有的添加元素的方法和拿走元 ...

  7. JAVA基础5——与String相关的系列(2)

    差异点比较 String使用+直接拼接 这种情况需要分两种情况来讨论: 1. 都是确定的字符串常量之间进行的+号拼接的时候,由于在编译器就可以确定其具体值了,所以编译器在编译期的时候就会把这些常量拼接 ...

  8. 今天用node的cheerio模块做了个某乎的爬虫

        一时兴起,想做个爬虫,经过各种深思熟虑,最后选择了某乎,毕竟现在某乎的数据质量还是挺高的.说干就干 打开某乎首页,随便搜索了一串关键字,相关的问题和答案就展现在眼前,我就思考怎么把这些搜索结果 ...

  9. Python带参数的装饰器

    在装饰器函数里传入参数 # -*- coding: utf-8 -*- # 2017/12/2 21:38 # 这不是什么黑魔法,你只需要让包装器传递参数: def a_decorator_passi ...

  10. MySql基础入门-mysql体系结构

    mysql体系结构:     由:连接池组件.管理服务和工具组件.sql接口组件.查询分析器组件.优化器组件.                缓冲组件.插件式存储引擎.物理文件组成.     mysq ...