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的尝试
一.谈谈"渲染" 相信好多人都挺听过"渲染"这个词,但不清楚它是什么意思?前端开发以为这是后端的活儿,后端开发以为是前端的事儿,推着推着就不了了之.其实渲染很简 ...
随机推荐
- python 中is和== 的理解
Python中的对象包含三要素:id.type.value其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值is判断的是a对象是否就是b对象,是通过id来判断的==判断的是a对 ...
- CNN中各种各样的卷积
https://zhuanlan.zhihu.com/p/29367273 https://zhuanlan.zhihu.com/p/28749411 以及1*1卷积核:https://www.zhi ...
- mysql8.0CTE实现递归查询
+----+----------+--------------+| ID | ParentID | name |+----+----------+--------------+| 1 ...
- html----不常见标签
控制文字滚动 <!-- direction="right up down left" --> <!-- behavior:滚动方式(包括3个值:scroll.sl ...
- BOM下的属性和方法---上
-------------BOM------------------------------------------------ 三个系统对话框 浏览器可以通过alert().confirm()和 ...
- JQuery中的工具类(五)
一:1.serialize()序列表表格内容为字符串.返回值jQuery示例序列表表格内容为字符串,用于 Ajax 请求. HTML 代码:<p id="results"&g ...
- JS高级 - 面向对象4(json方式面向对象)
把方法包在一个Json里 var p1 = { name: "唐三", sex: "男", dreamdu: { URL: "www.dreamdu. ...
- SpringBatch 错误积累
1.如果nextStep在该JOB中还没有配置,也就是说nextStep还不存在的情况下,就会报错 <end on="EIXT WITH IMBALANCE" /> & ...
- MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法
在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用普通用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况. 例如,我的MySQL中的用户为: mysql> ...
- 练习题|MySQL
MySQL主要内容: 1.数据库介绍.类型.特性2.MySQL数据库安装.连接.启动.停止3.表字段类型介绍.主键约束.表创建语句4.常用增删改查语句.分组.聚合5.外键管理.unique字段.表结构 ...