史上最详细springboot vue UEditor整合(包括遇到的各种坑)

2023-11-04

Vue中引入UEditor看这篇教程https://blog.csdn.net/kshon/article/details/102667318

接下来说说springboot中配置UEditor遇到的各种坑

1、将UEditor中目录下的config.json文件复制resource下

2、在Vue中配置后端接口

Ueditor初始化时会向serverUrl发送一条请求,格式如下,以获取上面的config.json配置

3、引入ueditor相关的jar包,springboot用maven引入比较好

        <dependency>
            <groupId>com.blingblingbang</groupId>
            <artifactId>ueditor</artifactId>
            <version>1.1.2</version>
        </dependency>

4、创建一个controller,以返回config.json配置,这个必须参照UEditor/jsp/controller.jsp

controller.jsp的内容如下,其实就是返回config.json

后端Controller的代码:

5、接下来运行测试,打开控制台发现没报错,但并不代表你的config就配置正确了

在浏览器中访问上面的地址http://localhost:820/config?action=config&callback=bd__editor__rcws22,返回的是

虽然看不懂,但明显不是config.json中的内容,所以说你并没有配置成功,那么我们上传照片测试一下

发现报错了:ueditor.all.js?2a41:24557 Uncaught ReferenceError: errorHandler is not defined

点进ueditor.all.js查看报错位置(注意:用ueditor.all.min.js查看是没有注释的,所以自己更换成ueditor.all.js再查看)

意思很明显了,你的后端配置没有成功

可是从刚刚的Controller来看,已经读到了config/config.json文件了,那是哪里出错了呢 ?

仔细看代码会发现有一个new ActionEnter( request, path ).exec(),我们点进去查看里面的源代码,看看是不是修改了路径

ActionEnter的构造方法中,将刚刚读到的资源路径作为参数去获取ConfigManager实例了,我们继续看ConfigManager的getInstance方法

上面的request.getRequestURI()获取的是访问路径http://localhost:820/config?action=config&callback=bd__editor__rcws22中除去前缀的uri,也就是/config,他作为uri传递到ConfigManager类的构造方法中,并且还与根目录相加!就是说现在originalPath的值是“classes/config/config.json/config”

接着我们看看在initEnv()方法中的逻辑,可以看到他先获取的originalPath的

父目录(classes/config/config.json),然后再调用getConfigPath()方法

再查看getConfigPath方法 ,可以发现他用父目录+config.json,所以现在整个文件地址就变成了

classes\config\config.json\config.json

如果你不信的话,可以在Controller中自己打印看看,添加几条语句,其实就是上面 两个类的处理逻辑

现在你重新上传图片试试,看看看控制台的打印

重点:所以我们知道问题出在哪里的,UEditor会自动帮我们添加config.json,所以我们只要定位到他的父目录就行了,修改Controller的代码为

6、这样还没完,现在可以 访问 http://localhost:820/config?action=config&callback=bd__editor__b7e248获取config.json的内容了,但是我们还是无法上传图片,为什么呢,因为我们这个controller只能在初始化时测试接口是否正确,还没有写接收图片的代码,我们研究一下config.json的代码,可以发现三个比较重要的参数

imageActionName:上传图片时的action名称,上面测试时url中的参数是action=config,如果上传图片时会变成action=ueditorImage,在这里我们就可以通过action的名字去判断并进行路由转发了,从而实现上传图片、视频等

imageUrlPrefix:路由前缀,也就是http://ip地址:端口号/项目名

imagePathFormat:保存路径的格式

6、解决了config.json的坑,还没有完成图片上传的完整功能(网上的文章大多数都到此为止,没有给出图片上传的具体思路)

上面说了,初始化时的请求是http://localhost:820/config?action=config&callback=bd__editor__nbzdeo,而上传图片时的请求是

http://localhost:820/config?action=ueditorImage,当然这个是post请求,他还附带了一个文件,可以看到两个请求中的action值不同,其中的action值是通过config.json中的imageActionName配置的,那我们就可以通过判断action的值去决定是返回config.json还是上传图片,甚至是上传视频等等

修改Controller:

上面通过一个参数MultipartFile upfile去接收上传的文件,这里又要注意了,这个upfile名称是根据config.json中imageFieldName属性配置的,一定要一致,否则不会自动注入,那么你接收的文件就是null

上面的controller用到了一个自己写的上传图片的工具类UEditorUpload,这里给出完整代码

@Component
public class UEditorUpload {
    @Value("imgUrl")
    private  String URL;
    private Log log = LogFactory.getLog(UEditorUpload.class);
    private String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();

    public UEditorFile uploadImage(MultipartFile file) throws IOException {
        log.info("UEditor开始上传文件");
        String fileName = file.getOriginalFilename();  //获取文件名
        //Ueditor的config.json规定的返回路径格式
        String returnPath = "/image/ueditor/"+new Date().getTime()+"/"+fileName;   
        File saveFile = new File(path+"static"+returnPath);
        if (!saveFile.exists()){
            saveFile.mkdirs();
        }
        file.transferTo(saveFile);  //将临时文件移动到保存路径
        log.info("UEditor上传文件成功,保存路径:"+saveFile.getAbsolutePath());
        UEditorFile uEditorFile = new UEditorFile();
        uEditorFile.setState("SUCCESS");
        uEditorFile.setUrl(returnPath);  //访问URL
        uEditorFile.setTitle(fileName);
        uEditorFile.setOriginal(fileName);
        return uEditorFile;
    }
}

其中UEditorFile是一个javaBean

//我使用的是lombok,没有这个查看的同学自行添加getter/setter方法
@Data
public class UEditorFile {

    private String state;
    private String url;
    private String title;
    private String original;
}

注意上面的这个参数是按照官网给出的规范来写的

要注意的点是返回路径是按照config.json中的imagePathFormat格式来写的,{time}代表时间戳,{filename}代表图片名称 ,其返回url必须是按照这个格式,然后Ueditor会根据imageUrlPrefix+imagePathFormat去拼接得到最后的图片访问路径

接下来重新上传图片

发现他报错说请求希望得到MIME的json格式,可是我们返回的UEditorFile 对象会自动转换为json呀,其实他是希望得到一个json字符串,好,那我们修改Controller,返回一个json字符串

这时候再去上传图片你会发现单图上传总是失败,但是后台又打印日志说已经上传成功,并且如果你选择多图片上传却能成功!

这到底是为什么呢?带着疑问,我们要进入ueditor.all.js中查看源码,打印错误日志才行,我们首先想到的是查找关键词,那么关键词从哪来呢,当然是conifg.json的配置项,我们知道既然能上传成功但又无法显示,那很有可能是访问不到,甚至是可怕的跨域问题,所以这里的关键词一定是跟访问路径有关的,我们搜索imageUrlPrefix

 

发现有一个回调方法,里面写着imageUrlPrefix+json.url,这个json.url明显就是我们后端返回来的url,所以这里是拼接图片访问地址的地方,我们在下面的catch中打印日志

然后重新进行单图上传,查看控制台

看到关键词了吗?cross-origin,哦嚯,完蛋,真的是跨域问题,因为我的vue项目使用8080端口,但是springboot使用820端口,而ueditor使用的是iframe,所以出现跨域问题,我们去官网查看解决办法

http://fex.baidu.com/ueditor/#dev-crossdomain,拉到最底下

完了,看来就是不让我们安心脱坑,UEditor就是很多很多坑,所以我也没办法,大家使用着多图上传吧,不过我猜想将vue项目打包到springboot的static下后,就不会出现跨域问题了,因为整合到一个项目中了,后期我会自行尝试,小伙伴想知道结果的可以联系我QQ:971415953

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最详细springboot vue UEditor整合(包括遇到的各种坑) 的相关文章

随机推荐

  • ZYNQ产品生产拷机问题思考

    目前设计的ZYNQ产品支持QSPIFLASH SDka EMMC启动 主要启动方式主要有以下几种 全部启动文件存放在QSPIFLASH ZYNQ支持的QSPIFLASH为16MB大小 如果UBOOT 内核 设备树 文件系统全部存放在QSPI
  • 爬虫破解js加密破解(二) 有道词典js加密参数 sign破解

    在爬虫过程中 经常给服务器造成压力 比如耗尽CPU 内存 带宽等 为了减少不必要的访问 比如爬虫 网页开发者就发明了反爬虫技术 常见的反爬虫技术有封ip user agent 字体库 js加密 验证码 字符验证码 滑动验证码 点触式验证码等
  • Qt中如何让Widget窗体等子控件随边框自适应缩放

    实现的原则很简单 一切子控件都要在布局中添加 如果是widget作控件 widget内部也要有布局 本文将通过Qt Designer和代码化UI设计两种途径讲解实现方法 一 以Qt Designer为例 想要在这个Widget窗体内部再添加
  • Nginx反向代理与conf原理

    Nginx主要功能 Webservice 反向代理 负载均衡 逻辑上 nginx和server的关系是这样的 Nginx和路由器 交换机有什么区别 路由器是物理网关 nginx是应用层网关 物理上 他们的关系是下图这样的 Nginx hap
  • 第21章_瑞萨MCU零基础入门系列教程之事件链接控制器ELC

    本教程基于韦东山百问网出的 DShanMCU RA6M5开发板 进行编写 需要的同学可以在这里获取 https item taobao com item htm id 728461040949 配套资料获取 https renesas do
  • C语言详解系列——循环语句详解(1)while语句的语法结构

    文章目录 while语句 break continue while语句 之前的学习中我们了解到了if语句的用法 这个语句只会执行一次 但在我们的生活当中有许多事情是需要重复去做的 那我们应该怎么实现呢 C语言当中给我们引入了 while语句
  • Day 9

    1 在主函数定义一维数组并赋值 要求 定义函数实现冒泡排序 有参无返函数 定义函数实现输出 有参无返函数 include
  • CPU负载怎么理解?是不是CPU利用率?

    http www hackbase com tech 2011 08 16 64970 html 昨天查看Nagios警报信息 发现其中一台服务器CPU负载过重 机器为CentOS系统 信息如下 2011 2 15 星期二 17 50WAR
  • 这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [转自华尔街的强帖]怎样才能嫁给有钱人

    一个年轻漂亮的美国女孩在美国一家大型网上论坛金融版上发表了这样一个问题帖 我怎样才能嫁给有钱人 我下面要说的都是心里话 本人 25 岁 非常漂亮 谈吐文雅 有品位 想嫁给年薪 50 万美元的人 你也许会说我贪心 但在纽约年薪 100 万才算
  • YOLOV7详细解读(三)技术要点归纳

    YOLOV7技术要点归纳 技术要点归纳 YOLOV7技术要点归纳 前言 一 YOLOV7是什么 二 论文贡献 三 相关工作 四 网络架构 五 重参数化 六 模型缩放 七 E ELAN 结构图 分组卷积 八 损失函数 九 动态标签分配策略 步
  • Kubernetes Deployment

    Deployment是Kubernetes1 2引入的新概念 引入的目的是为了更好的解决Pod的编排问题 为此Deployment内部使用了Replica Set来实现目的 Deployment 相对于RC的一个最大升级是我们可以随时知道当
  • 使用Rider断点调试lua代码

    记录一下 新建调试配置 在 Rider 工具栏的 Debug Config 中点击 Editor Configigurations 然后点击 号 新建一个 Emmy Debugger NEW 输入调试器名字为 Tcp Debugger co
  • Linux中cmake指定特定版本gcc

    最近因为服务器上有多个gcc 编译llvm的时候需要使用5 1以上的 但是由于默认目录 usr bin下的gcc是4 8 5 在另外的目录下有一个7 3 1的 cmake默认使用老版本的gcc 导致cmake失败 报错 输入which gc
  • websocked基础

    websocked基础 http与websocked区别 http websocked websocked特点 如何使用websocked 补充blob对象或Arraybuffer对象 http与websocked区别 http 只能由客户
  • cannot find reference ‘keras’ in ‘__init__.py‘

    文章目录 起因 原因 解决办法 参考来源链接 起因 在网上找了开源代码 之前看的都是jupyter notebook编写的 今天用pycharm调试一个开源程序 发现总是不能调试 检查了好几遍编译环境都没问题 运行正常 就是不能调试 报错是
  • 早期计算机语言称为,程序设计语言是软件的基础和组成部分,也称为计算机语言...

    原标题 程序设计语言是软件的基础和组成部分 也称为计算机语言 程序是对计算任务的处理对象和处理规则的描述 必须装入计算机内部才能工作 没有操作系统 系统无用 程序设计语言是软件的基础和组成部分 也称为计算机语言 定义计算机程序的语法规则 由
  • torch.nn.Linear()函数讲解

    函数讲解 in features指的是输入的二维张量的大小 即输入的 batch size size 中的size out features指的是输出的二维张量的大小 即输出的二维张量的形状为 batch size output size
  • 【Matlab】智能优化算法_灰狼优化算法GWO

    Matlab 智能优化算法 灰狼优化算法GWO 1 背景介绍 2 基本思想 2 1 等级制度 2 2 狩猎方式 3 公式推导 3 1 社会等级制度 3 2 包围猎物 3 3 包围猎物 3 4 攻击猎物 3 5 搜索猎物 4 算法流程图 5
  • 史上最详细springboot vue UEditor整合(包括遇到的各种坑)

    Vue中引入UEditor看这篇教程https blog csdn net kshon article details 102667318 接下来说说springboot中配置UEditor遇到的各种坑 1 将UEditor中目录下的con