`

UEditor初步使用小结

阅读更多

最近公司项目中需要做一个简易的BBS论坛,相应的就需要富文本编辑器,之前使用过CFeditor,但UI总感觉不适合个人喜爱,经过对比后选择了百度开源的UEditor。

 

UEditor官网地址:http://ueditor.baidu.com/website/

 

目前最新版本:1.4.3,以下使用及配置都是基于此版本。我们使用的是jsp版本,以下为默认目录:



 进入jsp目录,我们可以看到ueditor所需要依赖的包,以及统一处理入口controller.jsp,还有对应请求配置,主要是涉及上传图片,视频,文件等;

 

将ueditor引入eclipse的web工程中



 

由于项目中使用maven工程,需要将依赖的jar配置到pom.xml中


 

 

一、配置

1. 定义页面展现的对象

<script id="message" name="message" type="text/plain">

 

<textarea id="message"></textarea>

 

2. 引入UEditor的JS文件

<script type="text/javascript" src="${contextPath}/ueditor/ueditor.config.js"></script>
<script type="text/javascript" src="${contextPath}/ueditor/ueditor.all.min.js"></script>

 

 3. 根据实际情况,修改相应的配置

<script type="text/javascript">
// 定义UEditor对应的主目录
window.UEDITOR_HOME_URL = "${contextPath}/ueditor/";
// 页面加载完成后载入UEditor
window.onload = function () {
	window.UEDITOR_CONFIG.initialFrameWidth = 1600;
	window.UEDITOR_CONFIG.initialFrameHeight = 600;
	UE.getEditor("message");
}
</script>

 

4. 运行所在的WEB应用,浏览相应的页面就可以看到UEditor效果;



 

5. 可以根据实际需要对富文本进行精简

 

window.UEDITOR_CONFIG.toolbars = [[
	                                   'fullscreen', 'source', '|', 'undo', 'redo', '|',
	                                   'bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc', '|',
	                                   'rowspacingtop', 'rowspacingbottom', 'lineheight', '|',
	                                   'customstyle', 'paragraph', 'fontfamily', 'fontsize', '|',
	                                   'directionalityltr', 'directionalityrtl', 'indent', '|',
	                                   'justifyleft', 'justifycenter', 'justifyright', 'justifyjustify', '|', 'touppercase', 'tolowercase', '|',
	                                   'link', 'unlink', '|', 'imagenone', 'imageleft', 'imageright', 'imagecenter', '|',
	                                   'insertimage', 'insertvideo', 'emotion', 'pagebreak', '|',
	                                   'horizontal', 'date', 'time', 'spechars', '|',
	                                   'inserttable', 'deletetable', 'insertparagraphbeforetable', 'insertrow', 'deleterow', 'insertcol', 'deletecol', 'mergecells', 'mergeright', 'mergedown', 'splittocells', 'splittorows', 'splittocols', '|',
	                                   'preview', 'searchreplace'
	                               ]];

 

6. 自定义请求地址,ueditor 1.4.2+ 推荐使用唯一的请求地址,通过GET参数action指定不同请求类型,但往往在实际开发中,我们需要自己定义图片或其它附件上传逻辑。UEditor默认上传目录为ueditor主目录/ueditor/jsp/upload/image/文件名,这里我们使用自己实现的文件上传逻辑,依赖spring mvc,以下为示例代码:

spring mvc 配置

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

	<!-- 自动扫描且只扫描@Controller -->
	<context:component-scan base-package="net.jforum.view.forum"
		use-default-filters="false">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
	</context:component-scan>

	<mvc:annotation-driven
		content-negotiation-manager="contentNegotiationManager">
		<mvc:message-converters register-defaults="true">
			<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg value="UTF-8" />
			</bean>
			<!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->
			<bean
				class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="prettyPrint" value="true" />
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

	<!-- REST中根据URL后缀自动判定Content-Type及相应的View -->
	<bean id="contentNegotiationManager"
		class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
		<property name="mediaTypes">
			<value>
				json=application/json
				xml=application/xml
			</value>
		</property>
	</bean>

	<!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL -->
	<mvc:default-servlet-handler />

	<!-- 定义无需Controller的url<->view直接映射 -->
	<mvc:view-controller path="/" view-name="index" />
	
	<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 指定所上传文件的总大小不能超过6M。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->  
        <property name="maxUploadSize" value="6291456"/>
        <property name="resolveLazily" value="true"/>
    </bean>

</beans>
      图片上传:

 

 

    private static Logger logger = Logger.getLogger(UeditorAction.class);

    private ObjectMapper  mapper = new ObjectMapper();

    @RequestMapping(value = "uploadImage", method = RequestMethod.POST)
    @ResponseBody
    public String uploadImage(@RequestParam("upfile") MultipartFile file, HttpServletRequest request,
            HttpServletResponse response) {
        String output = "";
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            String fileName = file.getOriginalFilename();
            String uuid = UUID.randomUUID().toString();
            Map<String, Object> userInfo = SSOUserUtil.getPrincipal(request);
            String userId = String.valueOf(userInfo.get(IUser.USER_ID));
            String filePath = FilePathUtil.getUploadFullPath(String.valueOf(userId),
                    uuid + fileName.substring(fileName.lastIndexOf(".")));
            FileUtil.uploadFile(filePath, file.getInputStream());

            String url = Base64.encodeBase64String(filePath.getBytes("UTF-8"));
            result.put("url", HttpServletUtil.getServerName(request) + "/ueditor/getImage/" + url);
            result.put("original", fileName);
            result.put("size", file.getSize());
            result.put("type", fileName.substring(fileName.lastIndexOf(".")));
            result.put("state", "SUCCESS");

            output = mapper.writeValueAsString(result);
        } catch (Exception e) {
            logger.error("ueditor image upload error : ", e);
        }

        return output;
    }
     页面图片上传请求地址:

 

 

   UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;
	UE.Editor.prototype.getActionUrl = function(action) {
	    if (action == "uploadimage") {
	        return "${contextPath}/ueditor/uploadImage";
	    } else {
	        return this._bkGetActionUrl.call(this, action);
	    }
	}
     图片获取:

 

 

    @RequestMapping(value = "getImage/{path}", method = RequestMethod.GET)
    public void getImage(@PathVariable String path, HttpServletRequest request, HttpServletResponse response) {
        FileInputStream fis = null;
        OutputStream os = null;
        try {
            path = new String(Base64.decodeBase64(path), "UTF-8");
            fis = new FileInputStream(path);
            os = response.getOutputStream();
            int c;
            byte[] b = new byte[4096];
            while ((c = fis.read(b)) != -1) {
                os.write(b, 0, c);
            }
            os.flush();
        } catch (Exception e) {
            logger.error("ueditor get image error : ", e);
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (Exception e) {

                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (Exception e) {

                }
            }
        }
    }
 到此图片上传OK。


 

 

 

 

 

二、 问题:

由于这个论坛只是公司项目中的一个子项目,且此工程需要集成到一个信息门户CMS中,在现有项目中是通过iframe的方式将这个工程内嵌到信息门户CMS的,这里会遇到iframe跨域的问题,好在我们的项目是集成部署的,最终配置的域名统一,例如信息门户CMS地址为www.test.com,论坛地址:bbs.test.com,他们的根域都是test.com,所以在集成中通过设置document.domain来解决跨域造成的iframe高度自适应问题

 

document.domain = "test.com";

 

具体代码如下:

a. 在信息门户CMS的iframe所在页面中设置域名

 

document.domain = "test.com";
b. 在信息门户CMS中创建共用JS,由第三应用(这里就是BBS论坛)调用这个JS文件,我们这里默认称它为代理JS,取名为agent.js,只有一句话;

 

 

document.domain = "test.com";
c. 在BBS论坛中,在公用页面引用agent.js

 

 

<script type="text/javascript" src="http://www.test.com/agent.js"></script>
d.这样就解决了iframe的跨域问题,可以互相访问对方应用页面中的document对象,我们这里需要解决的是iframe跨域高度自适应的问题,那么我们就可以在CMS页面onload时,通过获取iframe页面中的实际高度来设置iframe具体的高度。

 

<iframe id="iframeB" name="iframeB" width="100%"
				src="http://bbs.test.com/1.html" allowtransparency="yes" frameborder="false"
				scrolling="no" onload="initSalon(this)"></iframe>

 

function reinitIframe() {
			var iframe = document.getElementById("iframeB");
			try {
				var bHeight = iframe.contentWindow.document.body.scrollHeight;
				var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
				var height = Math.max(bHeight, dHeight);
				iframe.style.height = height + "px";
			} catch (ex) {

			}
		}

 

e. 但后面的问题又来了,iframe中的页面的高度是不断变化的,所以我们又需要根据iframe的高度变化来动态改变CMS页面的高度,此时我们可以通过setInterval动态个性iframe的高度

 

setInterval(reinitIframe, 200);

 

f. 我们默认设置iframe的初始高度小一些,这样比较明显

 

function initSalon(e) {
			e.style.height = '450px';
		}

 

g. 这里我们是解决的iframe跨同子域的问题,如何实现完全跨域的iframe高度自适应的问题,可以参照链接:

http://www.cnblogs.com/snandy/p/3902337.html

http://www.cnblogs.com/snandy/p/3900016.html

http://zoujialiang.iteye.com/blog/682216

http://cued.xunlei.com/log019

http://blog.sina.com.cn/s/blog_63940ce201015w0d.html

http://caibaojian.com/iframe-adjust-content-height.html

 

再回到我们的UEditor,由于内嵌在CMS中的页面设置了document.domain = “test.com”,而我们的UEditor上传图片,上传视频等 ,需要新打开一个窗口,且窗口是通过iframe进行加载的,这里初步的弹出窗口域名为bbs.test.com,两者不在一个域名下,此时我们的UEditor就无法正常使用,此时我们就得个性UEditor默认的配置

a. 修改ueditor/dialogs/internal.js文件,在第一行,即在var parent = window.parent;上方增加:document.domain = “test.com”,但此时只能解决在chrome和firefox中跨域的问题,但在IE在还是无法使用,提示“没有权限”,此时我们需要再修改editor.all.js

将:

src: 'javascript:void(function(){document.open();' + (options.customDomain && document.domain != location.hostname ?  'document.domain="' + document.domain + '";' : '') +
                        'document.write("' + html + '");document.close();}())'

 修改为:

src: 'javascript:void(function(){document.open();' + 'document.domain="test.com"' +
                        'document.write("' + html + '");document.close();}())'

 同时在方法Editor.prototype._setup中me.document = doc;下方增加document.domain = “test.com"。



 



 

 

至此终于解决了跨子域的问题,可以正常上传图片,上传在线视频等。



 

 

 

  • 大小: 32.2 KB
  • 大小: 25.1 KB
  • 大小: 24.8 KB
  • 大小: 17.6 KB
  • 大小: 26.6 KB
  • 大小: 52.8 KB
  • 大小: 381.7 KB
  • 大小: 67 KB
  • 大小: 96.6 KB
  • 大小: 80.9 KB
  • 大小: 191.7 KB
分享到:
评论

相关推荐

    百度UEditor使用说明

    下面是关于百度UEditor使用说明的详细知识点总结: 一、UEditor的下载和安装 在使用百度UEditor之前,需要从官网下载相应的包,并将其导入到项目中。下载的包中包含了UEditor的核心文件和相关的依赖项。在下载完成...

    ueditor含使用方法

    【ueditor含使用方法】 ueditor是一款功能强大的富文本在线编辑器,被广泛应用于网站内容管理系统、论坛、博客等场景,提供给用户类似Word的编辑体验,使得在网页上编辑文字变得简单直观。ueditor以其丰富的插件、...

    ueditor包含使用方法

    **UEditor:全面解析与使用指南** UEditor是一款由百度公司开发的开源富文本编辑器,广泛应用于网页内容编辑和管理。它提供了丰富的编辑功能,包括文字格式化、图片上传、视频插入等,使得非技术人员也能轻松进行...

    百度富文本编辑器 ueditor 使用总结

    【百度富文本编辑器 ueditor 使用总结】 在Web开发中,富文本编辑器是一个不可或缺的工具,它允许用户以类似Word的方式编辑网页内容。百度的ueditor是一款功能强大的开源富文本编辑器,广泛应用于博客、论坛、CMS...

    ueditor使用案例源码

    【ueditor使用案例源码】是一个提供给开发者学习和实践的项目,主要展示了如何在MyEclipse环境中集成并运行ueditor。ueditor是一款强大的在线富文本编辑器,它提供了丰富的编辑功能,包括文本格式化、图片上传、视频...

    springboot+layui 整合百度富文本编辑器ueditor入门使用教程(踩过的坑).doc

    SpringBoot整合layui和百度富文本编辑器ueditor入门使用教程 本教程将指导您如何将layui和百度富文本编辑器ueditor整合到SpringBoot项目中。ueditor是一种轻量、可定制、注重用户体验的富文本web编辑器,由百度的...

    ueditor改版使用方法

    网上搜索后,发现有人也遇到此问题,并且对ueditor的源码进行编辑,实现了上传到项目外的指定目录下,但是不够灵活,只要使用了该jar包后,只能上传其他目录,本身到项目路径的又不支持了。我们项目的文件存放位置,...

    ueditor(单独使用上传图片)

    虽然编辑器实例被隐藏,我们仍可以使用ueditor提供的API手动触发图片上传,例如调用`UE.Editor.prototype.execCommand('insertimage', imgUrls)`,其中`imgUrls`是图片URL的数组。 6. **安全性与权限控制**: 在...

    ueditor使用说明文档

    ueditor 使用说明文档 UEditor 是一个由百度「FEX 前端研发团队」开发的所见即所得富文本 web 编辑器,具有轻量、可定制、注重用户体验等特点,开源基于 MIT 协议,允许自由使用和修改代码。 入门部署和体验 1. ...

    React中使用UEditor百度富文本的方法

    本文将详细介绍如何在React应用中引入并封装UEditor,以及解决在使用过程中可能遇到的问题。 首先,你需要从UEditor的官方网站下载最新版本的安装包,包含必要的配置文件和源码文件。这些文件通常包括`ueditor....

    Ueditor与jsp、SpringMVC整合,结合文档使用

    由于项目需求,要开发一个新闻发布模块,在网上找了找,看有没有什么插件可以用,后来发现了Ueditor百度编辑器,的确挺强大的。这里我只讲解jsp版本的,与servlet和SpringMVC整合,两种方式的应用。这里提供了纯...

    jsp中使用ueditor示例

    在本文中,我们将深入探讨如何在Java服务器页面(JSP)中集成并使用UEditor,一个功能丰富的在线富文本编辑器。UEditor是由百度开发的,它提供了多种文本编辑功能,如图片上传、代码高亮、表格操作等,广泛应用于...

    百度ueditor使用心得

    **百度UEditor使用心得** 百度UEditor是一款由百度公司开发的富文本编辑器,它专为Web开发者设计,提供了一套完整的在线文本编辑解决方案。这款编辑器以其强大的功能、易于集成和高度可定制性,受到了广大开发者的...

    ueditor-1.1.2_ueditor-1.1.2_ueditor_ueditor:jar:1.1.2_ueditor-1.

    在Java Web项目中使用ueditor-1.1.2.jar,通常需要以下步骤: 1. **引入依赖**:将JAR包加入到项目的类路径中,如在Maven项目中添加依赖配置。 2. **配置前端**:在HTML页面中引入UEditor的JavaScript和CSS资源,...

    vue 百度编辑器ueditor使用文件

    下面将详细介绍如何在Vue项目中使用百度编辑器UEditor。 首先,安装UEditor。在你的Vue项目中,通常会使用npm或yarn来管理依赖。打开终端,进入你的项目根目录,然后运行以下命令来安装UEditor: ```bash npm ...

    ueditor-1.1.2/ueditor-1.1.3

    - **官方文档**:官方文档详细介绍了UEditor的安装、配置、使用方法以及插件开发等,是学习和使用UEditor的重要参考资料。 7. **安全性与隐私保护** - **数据安全**:作为在线编辑器,UEditor需要处理用户的输入...

    ueditor-list

    总的来说,ueditor-list这个资源包对于ueditor的使用者来说是必不可少的,它包含了ueditor正常运行所需的一些基本图片资源。在无法直接访问ueditor官网的情况下,这些资源的本地存储和管理显得尤为重要。了解和掌握...

    SSH的ueditor使用

    将SSH与UEDitor结合,通常是在服务器端通过SSH协议处理与文件系统相关的操作,例如读取、保存或上传UEditor编辑的文件内容。这可能涉及到以下几个知识点: 1. **SSH配置**:首先,你需要在服务器上安装并配置SSH...

    使用UEditor实现富文本编辑图片上传附件上传实例

    1、内含两个文件:①、UEditorDemo.rar ②、UEdtior的简单使用.doc; 2、第一个文件是一个web项目,可以导入MyEclipse中直接启动看效果; 3、第二个文件时一个word文档,记录了UEditor的使用过程; 4、需要一个资源...

Global site tag (gtag.js) - Google Analytics