富文本编辑的组件有很多,大名鼎鼎的KENDO UI中自然也有,但是默认功能中,只能包含网络图片,

而如果要实现本地上传图片,KENDO UI也提供了相应的功能,但必须实现KENDO规定的多个接口,

而且功能过于丰富,有时项目并用不到,所以我想利用自定义按钮来实现,下面就是实现过程:

1、先在JSP中定义textarea标签,作为富文本编辑框的占位。

  1. <div class="form-group">
  2. <label class="col-xs-2 control-label">项目简述:</label>
  3. <div class="col-xs-8">
  4. <textarea id="project-desc" type="text" class="form-control" maxlength="10000"></textarea>
  5. </div>
  6. </div>

2、在JS脚本中定义其为KendoEditor,并设置其默认按钮,及自定义按钮。

  1. $("#project-desc").kendoEditor({
  2. tools: [
  3. "formatting",
  4. "bold", "italic", "underline",
  5. "justifyLeft", "justifyCenter", "justifyRight",
  6. "insertUnorderedList", "insertOrderedList", "indent",
  7. "createTable",
  8. {
  9. name: "image",
  10. tooltip: "Insert image",
  11. template: "<button type='button' class='k-button' onclick='uploadimg();'><span class='glyphicon glyphicon-picture' aria-hidden='true'></button>",
  12. }
  13. ],
  14.  
  15. keydown: function(e) {
  16. $(".k-editable-area").tooltip('destroy');
  17. }
  18. });

name为标签的名字,tooltip为悬停的提示,template为按钮的样式。

3、uploadimg()方法是打开文件上传选择窗口,这里我使用的是kendoWindow。

JSP代码:

  1. <div id="upload-img-win">
  2. <div class="container-fluid">
  3. <form id="editorUploadImg" action="${ctx }/Detail/uploadImg" enctype='multipart/form-data'>
  4. <input id="srcEditor" type="hidden"/>
  5. <div class="form-group ld-bottom" id="ImgUploadGroup">
  6. <label class="col-xs-2 control-label">图片上传:</label>
  7. <div class="col-xs-8">
  8. <button id="uploadImg-btn" type="button" class="btn btn-primary" onclick="openImgSelectFile();">选择文件</button>
  9. <label id="uploadImgFileName" class="control-label"></label>
  10. <input id="uploadImg" name="uploadImg" type="file" class="hidden" onchange="seletedImgFile();"/>
  11. </div>
  12. </div>
  13. <div class="row ld-top ld-bottom">
  14. <div class="col-xs-10">
  15. <div class="pull-right">
  16. <button id="doc-save-btn" type="button" class="btn btn-primary" onclick="uploadImgWinObj.save()">保存</button>
  17. <button id="doc-cancel-btn" type="button" class="btn btn-default" onclick="uploadImgWinObj.close()">关闭</button>
  18. </div>
  19. </div>
  20. </div>
  21. </form>
  22. </div>
  23. </div>

js代码:

  1. var uploadImgWinObj = null;
  2. //上传图片窗口
  3. function uploadImgWin() {
  4. var me = this;
  5.  
  6. this.winEl = $("#upload-img-win");
  7. this.winEl.kendoWindow({
  8. draggable : true,
  9. width : "650px",
  10. modal : true,
  11. pinned : false,
  12. title : "选择图片",
  13. visible : false,
  14. animation : false,
  15. resizable : false,
  16. actions : ["Close"]
  17. });
  18.  
  19. this.kObj = this.winEl.data("kendoWindow")
  20.  
  21. this.open = function(srcEditor) {
  22. clearInput("#upload-img-win");
  23. $("#uploadImgFileName").html("");
  24. $("#uploadImg").val("");
  25. $("#srcEditor").val(srcEditor);
  26. this.kObj.center();
  27. this.kObj.open();
  28. }
  29.  
  30. this.close = function() {
  31. this.kObj.close();
  32. }
  33.  
  34. this.save = uploadImg;
  35. }
  36.  
  37. //上传图片
  38. function uploadImg(){
  39. if($("#uploadImg").val()==""){
  40. markError("#uploadImg","没有选择任何文件!","#editorUploadImg")
  41. return;
  42. }
  43.  
  44. $("#editorUploadImg").ajaxSubmit({
  45. type: "post",
  46. success: function (data) {
  47. if(data!="-99"){
  48. // bootbox.alert("操作成功!");
  49. var srcEditor = $("#srcEditor").val();
  50. var editor = $(srcEditor).data("kendoEditor");
  51. editor.exec("insertHTML", { value: "<img src='"+ ctx + "/" + data +"' >"});
  52. uploadImgWinObj.close();
  53. }else{
  54. uploadImgWinObj.close();
  55. bootbox.alert("操作失败!");
  56. }
  57. },
  58. error: function(e){
  59. bootbox.alert("操作失败!");
  60. uploadImgWinObj.close();
  61. }
  62. });
  63. }
  64.  
  65. //选择图片
  66. function openImgSelectFile(){
  67. $("#uploadImg").click();
  68. }
  69.  
  70. //选中图片后,显示图片名称
  71. function seletedImgFile(){
  72. $("#uploadImgFileName").html($("#uploadImg").val());
  73. }
  74.  
  75. function uploadimg(){
  76. uploadImgWinObj.open("#project-desc");
  77. }
  78.  
  79. $(document).ready(function() {
  80. uploadImgWinObj = new uploadImgWin();
  81. }

openImgSelectFile和seletedImgFile是对文件选择控件的包装,为了显示效果好看些。

uploadImg方法采用了ajaxSubmit方式进行提交,这里需要引用jquery.form.js插件,

该插件可以使用AJAX异步方式上传文件,http://plugins.jquery.com/form/ 这里可以下载。

4、最后在Controller里实现保存上传图片功能。

  1. /**
  2. * 上传图片
  3. */
  4. @RequestMapping(value="/uploadImg")
  5. @ResponseBody
  6. public String uploadImg(HttpSession session,HttpServletRequest request,HttpServletResponse response,
  7. @RequestParam(value = "uploadImg", required = false) MultipartFile file) {
  8. try {
  9.  
  10. User loginUser = (User) session.getAttribute("loginUser");
  11.  
  12. // 获得上传文件的格式
  13. String fileName = "";
  14. String path = "";
  15. String url = "";
  16. //无文件则不做文档保存动作
  17. if(file!=null && !"".equals(file.getOriginalFilename())) {
  18. fileName = file.getOriginalFilename();
  19. String format = fileName.substring(fileName.lastIndexOf("."));
  20.  
  21. path = request.getSession().getServletContext().getRealPath("");
  22.  
  23. //使用UUID命名,防止文件重名
  24. UUID uuid = UUID.randomUUID();
  25. String newFileName = uuid.toString()+format;
  26. url = "resources/upload/"+loginUser.getUserId()+"/img/"+ newFileName;// 文件名
  27.  
  28. path = path + File.separator + "resources" + File.separator + "upload"+ File.separator+loginUser.getUserId()+ File.separator + "img";
  29. File diagramDirFile = new File(path);
  30. if (!diagramDirFile.exists()) {
  31. //如果文件夹不存在,则创建它
  32. diagramDirFile.mkdirs();
  33. }
  34. path = path + File.separator + newFileName;
  35. //保存上传文件
  36. FileCopyUtils.copy(file.getBytes(), new FileOutputStream(path));
  37.  
  38. }
  39.  
  40. return url;
  41.  
  42. } catch (IOException e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. return "-99";
  46. }
  47.  
  48. }

服务器回传上传图片的URL,在Editor中插入该地址即可展示图片

kendo ui 富文本编辑控件 Editor 实现本地上传图片,并显示的更多相关文章

  1. kendo UI 倒如css 和 js 后 窗口控件上的工具栏图标不显示如何解决

    examples 文档中找到window的例子打开一个 查看其中文件引入 <head>    <title>API</title>    <meta char ...

  2. FastReport.Net使用:[15]富文本控件使用

    富文本(Rich Text)控件用于显示Rtf格式的文本. 认识富文本编辑窗体 1.下图就是富文本的编辑窗体,乍一看就像Word一样,不过功能没有Word强大了.具体功能就不一一介绍了,用个Word的 ...

  3. [寒江孤叶丶的Cocos2d-x之旅_33]RichTextEx一款通过HTML标签控制文字样式的富文本控件

    RichTextEx一款通过HTML标签控制文字样式的富文本控件 原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net ...

  4. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  5. 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI

    [源码下载] 背水一战 Windows 10 (7) - 控件 UI: VisualState, VisualStateManager, 控件的默认 UI 作者:webabcd 介绍背水一战 Wind ...

  6. iOS开发UI篇—UIScrollView控件实现图片缩放功能

    iOS开发UI篇—UIScrollView控件实现图片缩放功能 一.缩放 1.简单说明: 有些时候,我们可能要对某些内容进行手势缩放,如下图所示 UIScrollView不仅能滚动显示大量内容,还能对 ...

  7. iOS开发UI篇—UIScrollView控件介绍

    iOS开发UI篇—UIScrollView控件介绍 一.知识点简单介绍 1.UIScrollView控件是什么? (1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限 ...

  8. iOS开发UI篇—UITableview控件简单介绍

    iOS开发UI篇—UITableview控件简单介绍 一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UIT ...

  9. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

随机推荐

  1. Unity关于一个UGUI优化效率的方法

    无意间发现了一个小技巧.如下图所示,可以发现UGUI的Image组件的RaycastTarget勾选以后会消耗一些效率,为了节省效率就不要勾选它了,不仅Image组件Text组件也有这样的问题. 一般 ...

  2. EventBus--介绍

    注意: 1,post()方法里面的类型和onEvent()中的类型要一致., 2,订阅者对象中 必须有 onEvent 的 public 方法     ---public void onEvent(O ...

  3. vs 配置宏

    Win_$(PROCESSOR_ARCHITECTURE)_$(PlatformArchitecture) <==> Win_x86_64 OR Win_x86_32$(Configura ...

  4. [ActionScript 3.0] 对代码加密的有效方法

    package { import flash.display.Loader; import flash.display.Sprite; import flash.net.LocalConnection ...

  5. 管道过滤器模式(Pipe and Filter)与组合模式(修改)

    转自:http://haolloyin.blog.51cto.com/1177454/348277 之前在 benjielin 前辈的博客中看到“管道过滤器(Pipe-And-Filter)模式(ht ...

  6. CentOS7:安装Zabbix

    参考:CentOS 7 yum安装Zabbix 1. 安装Zabbix Server EPEL源里面有Zabbix的安装包,所以需要先安装EPEL. Zabbix源也可以从这里获得:http://re ...

  7. linux中mysql如何设置为开机启动

    开机启动命令 chkconfig mysqld on 查询是否设置为开机启动命令 chkconfig --list mysqld 结果为 mysqld 0:关闭 1:关闭 2:启动 3:启动 4:启动 ...

  8. protocol

    For every object that can have a delegate, there is a corresponding protocol that declares themessag ...

  9. 2.1 ARM家族大检阅

    芯片名称 ARM核 指令架构 S3C2440 ARM9 ARMv4T S3C6410 ARM11 ARMv6 S5PV210 Cortex A8 ARMv7-A Cortex M工控 Cortex R ...

  10. 常用 C#操作字符串方法

    staticvoid Main(string[] args) { string s =""; //(1)字符访问(下标访问s[i]) s ="ABCD"; Co ...