UEditor实现前后端分离时单图上传
首先,需要下载部署ueditor相关代码,可以参考一篇简单的博客,这里不再赘述;
环境搭建好后,我们先简单使用一下,启动http://web.yucong.com:8080/ueditor/index.html页面。
(我这里只讲述单文件跨域请求的解决方案)需要调用获取默认配置的接口和上传单图时需要调用上传图片的接口。
获取默认配置的接口:

上传单图的接口:

因为我这里是前后端分离的,后端要独立出来,而且使用的是SpringBoot,不再使用JSP接收相关请求了,所以需要修改ueditor的相关默认配置。

ueditor.config.js中,需要修改serverUrl参数,修改成SpringBoot项目的controller地址:
我这里修改为:http://www.yucong.com:8001/admin/ueditor (www.yucong.com是在本机hosts文件中配置的,admin为项目名称,ueditor为Controller的访问地址)
, serverUrl: "http://www.yucong.com:8001/admin/ueditor/"
贴一下我的Controller代码吧:
/**
* 图片上传
*/
@RestController
@RequestMapping(value = "ueditor")
public class BaduUeditorController { @Autowired
private PictureService pictureService; /**
* 上传单张图片
*/
@RequestMapping(value = "uploadimage", method = RequestMethod.POST)
public void upload(HttpServletRequest request,HttpServletResponse response) throws IOException {
//仅做演示,具体实现代码很简单,这里不作展示,这里会有一个iframe跨域的问题,别急,后面会给出解决方法
String result = "{\"state\": \"SUCCESS\",\"original\": \"f59ace3303a2978faf3972e97397cdf.png\",\"size\": \"64079\",\"title\": \"1539934227542006306.png\",\"type\": \".png\",\"url\": \"http://img.i-banmei.com/test/Images/201810/22/aaefd6e3fa7c49a9b6c1e58259deea6120181022172845.jpg\"}";
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(result);
} /**
* 获取图片上传默认配置
*/
@RequestMapping(value = "config", method = RequestMethod.GET)
public void config(HttpServletRequest request,HttpServletResponse response) throws IOException {
//仅做演示,具体实现代码很简单,这里不作展示
String result = "{\"imageInsertAlign\":\"none\",\"imageMaxSize\":2048000,\"imageAllowFiles\":[\".png\",\".jpg\",\".jpeg\",\".gif\",\".bmp\"],\"imagePathFormat\":\"/ueditor/jsp/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}\",\"imageActionName\":\"uploadimage\",\"imageCompressEnable\":true,\"imageFieldName\":\"upfile\",\"imageCompressBorder\":1600,\"imageUrlPrefix\":\"/ueditor\"}";
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(result);
} }
在调接口时,UEditor会调一个方法getAction方法获取请求地址,具体看代码:


对getActionUrl方法的注释,源码里面说的也很清楚,我修改了8022行代码,用来兼容我的后台系统,毕竟示例代码是jsp实现的,我用springmvc来实现啊:
serverUrl = this.getOpt('serverUrl') + action;
注意:在调用http://www.yucong.com:8001/admin/ueditor/config接口时,有个跨域问题,也就是ueditor.all.js的8083行代码中isJsonp为true,使用的是jsonp请求。
给出我的解决方案吧,我直接将 isJsonp = false,使用拦截器让我的后台支持跨域访问,让前端调用时,使用传统非跨域的方式照样能访问。
//isJsonp = utils.isCrossDomainUrl(configUrl);
isJsonp = false; //默认都用doAjax请求
根据项目的实际情况来,你也可以使用jsonp的方式来实现。
开始上传图片了,发现图片是可以上传了,但是前端页面上没有成功,这个就是跨域问题引起的:

js异常描述为:
code:18
message:"Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "n "http://web.yucong.com:8080" fr" from accessing a cross-origin frame."
name:"SecurityError"
上网搜了一下,原因是:
ue的单文件上传是form提交到iframe,然后检测iframe里面的内容来返回结果,官方已经明确说明了单文件上传不能实现跨域上传,就是因为跨域的iframe是获取不到iframe里面的html代码的,所以现在不能获得上传地址。
调试了一下,也确实如此:

实现单文件跨域上传,首先要搞懂它的原理,它是form表单提交,将提交结果展示到iframe上,然后监控iframe加载完成后js获取iframe里面的内容也就是json结果来得到图片上传结果。
而跨域上传iframe里面的页面和当前页面不是同一个域名就获取不到json了,官方说暂时不支持,其实so easy,用传统的代理页面来解决,就是文件服务器上传成功后,不直接显示结果,
而是跳转到web.yucong.com下面来的reustl.html页面来,把结果传递到这个页面上,再输出来,这样iframe就在同一个域名上了,js就能直接获取iframe里面的内容了。
提交form表单时需要,加一行代码:

这样,就能识别出是单图时上传了。
再次贴一下后端代码:
/**
* 上传单张图片
*/
@RequestMapping(value = "uploadimage", method = RequestMethod.POST)
public void upload(HttpServletRequest request,HttpServletResponse response) throws IOException {
//图片上传到阿里云OSS上
String picPath = "http://banmei-oss.oss-cn-shanghai.aliyuncs.com/Images/201802/23/812627c218e94990b5bd0be83e48d22c.jpg";
String result = "{\"state\": \"SUCCESS\",\"original\": \"f59ace3303a2978faf3972e97397cdf.png\",\"size\": \"64079\",\"title\": \"1539934227542006306.png\",\"type\": \".png\",\"url\": " + picPath + "}";
if("true".equals(request.getParameter("issimpleupload")) {
response.sendRedirect("http://web.yucong.com:8080/ueditor/result.html?state=SUCCESS&url=" + picPath );
}
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(result); }
传数据给前端,暂时没有想到好的方法,我这里是用的是在请求URL后面拼接参数的方式来实现的,如果有好的方法欢迎提出。
对应的要修改ueditor.all.js里面图片上传成功的callback函数了,直接贴我写的代码吧:

大功告成,Game is over!

参考文章:
https://www.cnblogs.com/hpnet/p/6290452.html
https://segmentfault.com/a/1190000013187044
UEditor实现前后端分离时单图上传的更多相关文章
- Ueditor 前后端分离实现文件上传到独立服务器
关于Ueditor 前后端分离实现文件上传到独立服务器,在网上搜索确实遇到大坑,不过还好遇到了 虚若影 最终实现了,在此感谢!虚若影的原文博客网址:http://www.cnblogs.com/hpn ...
- 仵航说 前后端分离,文件上传下载(springBoot+vue+elementUI)仵老大
1.介绍 本文主要是介绍前后端分离的上传下载,后端使用的是SpringBoot,持久层用的是mybatis-plus,前端用的Vue,UI用的elementUI,测试了一下,文本,图片,excel ...
- 关于Ueditor 前后端分离实现文件上传到独立服务器的问题 望大神们赐教
最近,由于网站实现多台服务器负载均衡,导致编辑器上传文件需要同步,可是使用同步软件太慢,不太现实,所以想到实现编辑器上传文件直接上传到独立文件服务器.可是没想到遇到坑了. 1.在本地IIS 中添加网站 ...
- 前后端分离--ajaxUpload异步上传文件成功,前端获取数据却失败的解决方案
转载:https://blog.csdn.net/baidu_32809053/article/details/78709951
- vue+Ueditor集成 [前后端分离项目][图片、文件上传][富文本编辑]
后端DEMO:https://github.com/coderliguoqing/UeditorSpringboot 前端DEMO:https://github.com/coderliguoqing/ ...
- vue.js+UEditor集成 [前后端分离项目]
首先,谈下这篇文章中的前后端所涉及到的技术框架内容. 虽然是后端的管理项目,但整体项目,是采用前后端分离的方式完成,这样做的目的也是产品化的需求: 前端,vue+vuex+vue router+web ...
- 百度编辑器前后端二开图片上传Js Thinkphp tp5 ueditor
百度编辑器图片上传Jsueditor.all.min.js 下载链接 链接:https://pan.baidu.com/s/1VNgw9ELgRRHKeCQheFkQTw 提取码:fnfi 使用方法: ...
- 前后端分离中,Gulp实现头尾等公共页面的复用
前言 通常我们所做的一些页面,我们可以从设计图里面看出有一些地方是相同的.例如:头部,底部,侧边栏等等.如果前后端分离时,制作静态页面的同学,对于这些重复的部分只能够通过复制粘贴到新的页面来,如果页面 ...
- 谈谈渲染,玩玩nginx——前后端分离,转发请求到Tomcat的尝试
一.谈谈"渲染" 相信好多人都挺听过"渲染"这个词,但不清楚它是什么意思?前端开发以为这是后端的活儿,后端开发以为是前端的事儿,推着推着就不了了之.其实渲染很简 ...
随机推荐
- 使用Navicat Premium对mssql2008r2授权用户
使用Navicat Premium操作mssql2008r2数据库 比如需要对某个特定的数据tes添加一个管理员em,并且这个管理员只能对test这个数据库进行操作 使用sa连接数据库 1.新建一个登 ...
- Linux C 结构体初始化三种形式
最近看linux代码时发现了结构体 struct 一种新的初始化方式,各方查找对比后总结如下: 1. 顺序初始化教科书上讲C语言结构体初始化是按照顺序方式来讲的,没有涉及到乱序的方式.顺序初始化str ...
- LeetCode(62):不同路径
Medium! 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“F ...
- 【splunk】仪表盘导入导出
仪表盘导出: splunk目录/etc/users/admin/search/local/data/ui/views 目录下,拷贝所有的xml文件 导入: 创建仪表盘->编辑来源 将上面导 ...
- hdu4578线段树区间更新
/* 只有在区间中的数字不相同时才pushdown:往子区间传递数字再到子区间更新,同时该区间的flag置0 更新完左右子区间后进行pushup,如果左右子区间数字相同,那么把子区间合并,子区间数字置 ...
- (String中)正则表达式使用如下
package zhengze;/* * 正则表达式 */public class StringTestZhengZe { public static void main(String[] args) ...
- mysql 快速拷贝表
- 【读书笔记】《深入浅出Webpack》
Webpack版本 分析版本为3.6.0 4.0为最近升级的版本,与之前版本变化较大,编译输出的文件与3.0版本会不一致,目前项目中使用的版本3.0版本,所以基于3.0版本进行分析学习. Webpac ...
- Codeforces 983C Elevator dp (看题解)
Elevator 怎么今天写啥题都不会写啊, 我是傻了吗.. 把电梯里面四个人的目标点当作状态, 然后暴力转移. #include<bits/stdc++.h> #define LL lo ...
- Tr A HDU1575
矩阵基本算法 #include<cstdio> using namespace std; int n; struct matrix { int m[15][15]; }ans,base; ...