项目后端使用语言 :java ,ssm框架 maven 工程
(普通的jar包方式自己添加jar就OK了,)
最近项目中使用到富文本功能,参考和比较之下,采用了百度的Ueditor 富文本编辑器.感谢百度.
现在把实现的方式介绍给大家,使用的是最新的UEditor版本1.4.3.1,官网下载地址
,选择了 jsp 版
1、下载UEditor后,解压,把它放到工程里,还有它的Jar包也要放进去,1.4.3.1结构是这样的
(现在js 中有一处错误,不影响)
//2. 开始从前端配置介绍.
2.新建一个 html页面.引入ueditor的js. 注意引入的顺序.
代码:
<!-- 配置文件 -->
<
script
type=
"text/javascript"
src=
"
${
ctx
}
/static/ueditor/ueditor.config.js"
></
script
>
<!-- 编辑器源码文件 -->
<
script
type=
"text/javascript"
src=
"
${
ctx
}
/static/ueditor/ueditor.all.js"
></
script
>
<
script
type=
"text/javascript"
charset=
"utf-8"
src=
"
${
ctx
}
/static/ueditor/lang/zh-cn/zh-cn.js"
></
script
>
2.2 初始化 富文本编辑器容器
<
textarea
name=
"editor"
id=
"editor"
style=
"
width
:
76
%;
height
:
400
px
"
></
textarea
>
<
script
type=
"text/javascript"
>
var
ue
=
UE
.getEditor(
'editor'
,{
});
UE
.
Editor
.
prototype
.
_bkGetActionUrl
=
UE
.
Editor
.
prototype
.
getActionUrl
;
UE
.
Editor
.
prototype
.
getActionUrl
=
function
(action){
if
(action ==
'uploadimage'
||action==
'uploadscrawl'
|| action ==
'uploadimage'
) {
//图片上传的ctl
return
'/knowsource/action'
;
}
else if
(action ==
'uploadvideo'
){
//执行上传视频的action名称
return
'/knowsource/actionForVideo'
;
}
else
{
return this
.
_bkGetActionUrl
.
call
(
this
, action);
}};
</
script
>
2.3 在初始化富文本的 下面 写这段代码.(红线内的内容)
var ue = UE.getEditor('editor'); 就是创建面板用的,一定要有;如果不使用自定义上传,那么下面的也就不需要了,只要创建面板那一句就够了。
作用:
UE.Editor.prototype._bkGetActionUrl=UE.Editor.prototype.getActionUrl; 是用来获取Action的,照写就行,然后就是下面的 UE.Editor.prototype.getActionUrl=function(action){....} 这里面的if语句,就是用来设置自定义action的,这里叫Controller.
2.4 修改 ueditor下jsp里面的config.json
你会发现,下面有个imageActionName,这个xxxxActionName,开始以为是需要把自定义上传Controller设置在这边,所以我点击上传的时候就报,错误的Action还是未知的Action,实际上这是UEditor默认的Action,上面我们有看到 if (action == 'uploadimage' ||action== 'uploadscrawl' || action == 'uploadimage') {....} else if(action =='uploadvideo') {....} else if(action == 'listimage'){....} else{returnthis._bkGetActionUrl.call(this, action);}}
if语句里面的这些,对应的就是默认的action名称,说到这里,大家应该知道了吧, 要自定义上传什么就在这个script里面加if语句来判断即可,实在没有,它就返回 this._bkGetActionUrl.call(this,action); 这个东西我想你应该要有,否则没找到你设置的action它本地也上传不了。
例如:现在 上面我自己定义,图片上传的control 请求 的
/knowsource/action
视频上传的请求路径 /knowsource/actionForVideo
上传视频路径
下面会介绍,怎么定义上传 图片和视频的 请求路径.
//图片上传路径. config.json文件中.imageActionName 命名要和 上面介绍if 中action 名称一致,不认进不去判断. 就不会自己设计的请求路径 发送请求.
单个图片上传.一般不会有太多问题.
介绍一下多图片上传,和视频上传的 注意修改的位置.
=============多图片上传 ==打开ueditor/dialogs/image/image.js 文件===============
696行. 修改代码
uploader
.on(
'all'
,
function
(type, files) {
switch
(type) {
case
'uploadFinished'
:
setState
(
'confirm'
, files);
break
;
case
'startUpload'
:
/* 添加额外的GET参数 */
var
params
=
utils
.
serializeParam
(
editor
.
queryCommandValue
(
'serverparam'
)) ||
''
,
// url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);
url
=
utils
.
formatUrl
(
actionUrl
);
//
TODO 修改多图片上传路径
uploader
.option(
'server'
,
url
);
setState
(
'uploading'
, files);
break
;
case
'stopUpload'
:
setState
(
'paused'
, files);
break
;
}
});
=============视频上传 ==打开ueditor/dialogs/video/video.js 文件===============
707行
uploader
.on(
'all'
,
function
(type, files) {
switch
(type) {
case
'uploadFinished'
:
setState
(
'confirm'
, files);
break
;
case
'startUpload'
:
/* 添加额外的GET参数 */
var
params
=
utils
.
serializeParam
(
editor
.
queryCommandValue
(
'serverparam'
)) ||
''
,
/* url = utils.formatUrl(actionUrl + (actionUrl.indexOf('?') == -1 ? '?':'&') + 'encode=utf-8&' + params);*/
url
=
utils
.
formatUrl
(
actionUrl
);
uploader
.option(
'server'
,
url
);
setState
(
'uploading'
, files);
break
;
case
'stopUpload'
:
setState
(
'paused'
, files);
break
;
}
});
=====================后端代码====================
pom依赖
<!-- ueditor 依赖包-start-->
<
dependency
>
<
groupId
>
cn.songxinqiang
</
groupId
>
<
artifactId
>
com.baidu.ueditor
</
artifactId
>
<
version
>
1.1.2-offical
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
org.json
</
groupId
>
<
artifactId
>
json
</
artifactId
>
<
version
>
20160810
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
commons-io
</
groupId
>
<
artifactId
>
commons-io
</
artifactId
>
<
version
>
2.4
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
commons-fileupload
</
groupId
>
<
artifactId
>
commons-fileupload
</
artifactId
>
<
version
>
1.3.1
</
version
>
</
dependency
>
<
dependency
>
<
groupId
>
commons-codec
</
groupId
>
<
artifactId
>
commons-codec
</
artifactId
>
<
version
>
1.9
</
version
>
</
dependency
>
<!-- ueditor 依赖包-end-->
===============
Controller
=============
package
com.ampmind.front.crm.web.controller;
import
com.ampmind.framework.api.base.Response;
import
com.ampmind.service.crm.rpc.KnowledgeBaseService;
import
com.ampmind.service.crm.rpc.protocol.KnowledgeBaseModel;
import
com.ampmind.service.ois.clinet.OisHelper;
import
com.ampmind.service.ois.constant.ChannelType;
import
com.ampmind.service.ois.model.ResponseModel;
import
com.ampmind.service.ois.rpc.OisService;
import
com.ampmind.service.ois.utils.OisUtil;
import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
import
org.springframework.beans.factory.annotation.
Autowired
;
import
org.springframework.http.MediaType;
import
org.springframework.stereotype.
Controller
;
import
org.springframework.web.bind.annotation.
RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod;
import
org.springframework.web.bind.annotation.
ResponseBody
;
import
org.springframework.web.multipart.MultipartFile;
import
org.springframework.web.multipart.MultipartHttpServletRequest;
import
org.springframework.web.multipart.MultipartRequest;
import
javax.servlet.http.HttpServletRequest;
import
java.io.IOException;
import
java.io.InputStream;
import
java.util.HashMap;
import
java.util.Map;
import
java.util.Set;
/**
* Ueditor 百度富文本编辑器,(demo)
*
* 作用:提供开发百度富文本使用
*
*
@Auther
:WangYongKun
*
@Date
2017/11/13 0013
*/
@Controller
@RequestMapping
(
"knowsource"
)
public class
UeditorController
extends
CrmBasicController {
private final
Logger
logger
= LoggerFactory.
getLogger
(UeditorController.
class
);
@Autowired
private
OisHelper
oisHelper
;
@Autowired
private
OisService
oisService
;
@Autowired
private
KnowledgeBaseService
knowledgeBaseService
;
/**
* 文件上传方法
*
@param
request
*
@return
*/
public
String uploadFile(HttpServletRequest request) {
String url =
null
;
try
{
MultipartRequest mr = (MultipartRequest)request;
Map<String, MultipartFile> map = mr.getFileMap();
Set<String> keySet = map.keySet();
for
(String key : keySet) {
MultipartFile multipartFile = map.get(key);
String type = multipartFile.getContentType();
InputStream inputStream = multipartFile.getInputStream();
String base64 = OisUtil.
getString
(inputStream);
//阿里云配置.无须关系
ResponseModel model =
oisHelper
.upload(
"CRM_PIC"
, base64, multipartFile.getOriginalFilename(),
"/CRM/Path"
, ChannelType.
PUBLIC
,
900
,
true
,
null
,
null
);
if
(model.getStatus()) {
url =
oisService
.getPublicFileUrl(String.
valueOf
( model.getResult()));
}
}
return
url;
}
catch
(RuntimeException e){
logger
.info(
""
,
"系统异常:{}"
, e);
return null
;
}
catch
(IOException e){
logger
.info(
""
,
"系统异常:{}"
, e);
return null
;
}
}
//==================图片上传======================
@RequestMapping
(value =
"/action"
, method = RequestMethod.
POST
, produces = MediaType.
APPLICATION_JSON_VALUE
)
@ResponseBody
public
Map<String,Object> save(HttpServletRequest req){
Map<String,Object> rs =
new
HashMap<String, Object>();
MultipartHttpServletRequest mReq =
null
;
MultipartFile file =
null
;
InputStream is =
null
;
String fileName =
""
;
// 原始文件名 UEDITOR创建页面元素时的alt和title属性
String originalFileName =
""
;
String filePath =
""
;
try
{
mReq = (MultipartHttpServletRequest)req;
// 从config.json中取得上传文件的ID
file = mReq.getFile(
"upfile"
);
// 取得文件的原始文件名称
fileName = file.getOriginalFilename();
originalFileName = fileName;
String s =
this
.uploadFile(req);
/*你的处理图片的代码*/
rs.put(
"state"
,
"SUCCESS"
);
// UEDITOR的规则:不为SUCCESS则显示state的内容
rs.put(
"url"
,s);
//能访问到你现在图片的路径
rs.put(
"title"
, originalFileName);
rs.put(
"original"
, originalFileName);
}
catch
(Exception e) {
logger
.error(
"图片上次失败"
,e);
rs.put(
"state"
,
"文件上传失败!"
);
//在此处写上错误提示信息,这样当错误的时候就会显示此信息
rs.put(
"url"
,
""
);
rs.put(
"title"
,
""
);
rs.put(
"original"
,
""
);
}
return
rs;
}
/////actionForVideo 上传视频的action
@RequestMapping
(value =
"/actionForVideo"
, method = RequestMethod.
POST
, produces = MediaType.
APPLICATION_JSON_VALUE
)
@ResponseBody
public
Map<String,Object> saveVideo(HttpServletRequest req){
Map<String,Object> rs =
new
HashMap<String, Object>();
MultipartHttpServletRequest mReq =
null
;
MultipartFile file =
null
;
InputStream is =
null
;
String fileName =
""
;
String originalFileName =
""
;
String filePath =
""
;
try
{
mReq = (MultipartHttpServletRequest)req;
// 从config.json中取得上传文件的ID
file = mReq.getFile(
"upfile"
);
// 取得文件的原始文件名称
fileName = file.getOriginalFilename();
originalFileName = fileName;
String returnPath =
this
.uploadFile(req);
//封装好的服务
rs.put(
"state"
,
"SUCCESS"
);
// UEDITOR的规则:不为SUCCESS则显示state的内容
rs.put(
"url"
,returnPath);
//返回上传到服务红的成功路径
rs.put(
"title"
, originalFileName);
rs.put(
"original"
, originalFileName);
}
catch
(Exception e) {
logger
.error(
"文件上次失败"
,e);
rs.put(
"state"
,
"文件上传失败!"
);
rs.put(
"url"
,
""
);
rs.put(
"title"
,
""
);
rs.put(
"original"
,
""
);
}
return
rs;
}
}
==========点击图片组件反应慢的问题==============
修改 ueditor.all.js 中 [
accept=image/* 修改为accept="image/jpg,image/jpeg,image/png".
注意点:
1.对于图片 ,和视频格式参照Ueditor 官方文档.
2.注意 ueditor 配置文件引入顺序
3.对图片和视频路径.
如果采取上面的 自定义的方式请求controller 的话,需要更改 image.js和video.js 的上传路径.
4.注意返回值,遵守官网地址的规范.(因为百度的ueditor 中的写好的返回值,例如:成功接受
SUCCESS)
{ "state": "SUCCESS", "url": "upload/demo.jpg", "title": "demo.jpg", "original": "demo.jpg"}
官方文档还是要看的,有坑就填.
文章中没有提及到 怎么上传到阿里云上操作.这是公司封装好服务,不便介绍.
上传 图片和视频成功demo页面
我也是看了被人的博客得到部分帮助,希望在加上自己的一点东西,继续为uedittor的使用多一个解决方案.
希望对您有帮助.