百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
个人官网、公司项目都需要 可视化编辑器,百度UEditor做得很不错,就用的这个。项目后台用到了SpringMVC、Freemarker,开发过程中部署在Jetty,线上部署用Tomcat,最后可能配置Nginx代理。
在实际使用过程中,遇到了太多的问题,因此有必要梳理和总结下。
1. 先说百度UEditor在Java环境中的使用:
1.1 Html页面或者Freemarker模版里,引入百度UEditor的相关JS和CSS,如下
<script type="text/javascript" src="../../public/framework/ueditor/ueditor.config.js"></script>
<!-- 编辑器源码文件 -->
<script type="text/javascript" src="../../public/framework/ueditor/ueditor.all.js"></script>
<script type="text/javascript" src="../../public/framework/ueditor/lang/zh-cn/zh-cn.js"></script>
<!-- 实例化编辑器 -->
<script type="text/javascript">
var ue = UE.getEditor('editor');
</script>
1.2接着在正文中,有如下代码
<script id="editor" type="text/plain" name="content" ></script>
1.3配置图片上传
ueditor.config.js设置:serverUrl: URL + "../../../ueditor/controller.jsp"
这个请求向后端发送请求:
获得config.json总体的配置文件,config.json里设置了 抓取图片的url等各种参数。
2.图片上传是最麻烦的地方:
2.1项目中使用的是Freemarker作为视图层,并且我不想再配置JSP视图解析了,故不想使用controller.jsp这种JSP。
而是改成了SpringMVC的Controller:
@Controller
public class UeditorController {
@RequestMapping("/ueditor/config")
public void config(HttpServletRequest request,
HttpServletResponse response, String action) {
response.setContentType("application/json");
// config.json配置文件和图片上传位置,都默认为“网站根目录”
String rootPath = request.getSession().getServletContext() .getRealPath("/");
//自己设置的目录
Object uploadRootPath = BasePropertyConfigurer.getContextProperty("setting.upload_root_path");
if (uploadRootPath != null) {
rootPath = uploadRootPath.toString();
}
try {
String exec = new ActionEnter(request, rootPath).exec();
PrintWriter writer = response.getWriter();
writer.write(exec);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代码中的大部分内容,都是从controller.jsp搬来的。
经过实际使用发现,config.json配置信息和图都需要放到项目内部,即webapp下。
我个人想把图片存放到外部目录,方便备份,并且就算整个项目完全重新部署,用户和项目的图片数据也不会丢失。
所以,手动修改了rootPath ,最后config.json和图片目录都存放在C:/img下。
2.2第二天突然发现,图片无法上传 ,错误提示“无法获得数据”。(这个问题困扰了我几个小时)
Debug跟踪了每一层,发现SpringMVC拦截了图片上传请求。用户上传的图片,已经存储到服务器的临时目录,在拷贝这个图片到实际存储目录,提示找不到,最后也无法把图片回显给前端。
最后经过逐步对比昨天的代码,突然发现,某同事增加了SpringMVC上传配置。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
有了上述配置,通过SpringMVC的Controller响应UEditor的各种请求,就出了问题。也没有找到好的解决办法。
最终,还是使用JSP的。
2.3使用JSP-controller.jsp响应UEditor,在SpringMVC中增加JSP视图解析配置。
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/ueditor/" />
<property name="suffix" value=".jsp" /><!--可为空,方便实现自已的依据扩展名来选择视图解释类的逻辑 -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</bean>
2.4图片上传之后,前端还需要回显图片,这个时候又要响应图片请求。
后端管理系统,SpringMVC是拦截所有的请求,“/”,而不是只拦截动态请求,比如“*.html”。所以,SpringMVC可以处理拦截到图片请求。
增加如下配置:
<mvc:resources mapping="/ueimg/ueditor/**" location="file:${setting.upload_root_path}/ueimg/ueditor/**" />
2.5我不想让SpringMVC处理图片,以为我觉得让Tomcat性能更好。
问题来了,图片是存储到服务器的外部目录,比如C:/img,而不是/webapp/img。
针对服务器内部的图片,Tomcat可以如下配置,web,xml
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
而据Boss所说,web.xml里不能映射图片到外部目录。(我没有去尝试)
解决办法显然是有的,只要部署了Nginx,任何静态资源,我都可以配置代理,让Nginx响应或者控制转发。
但是,在开发过程中,我绝对不愿意再整个Nginx,项目开发依赖的环境越来越多,这是个大问题。
我认为Nginx只是提高性能,方便线上的,本地项目开发根本不应该依赖它。
最后,目前的情况下,我是让SpringMVC处理百度UEditor的图片请求,等到线上部署,配置Nginx,让Ngnix处理。
2.6除了上面第2个问题,增加SpringMVC上传配置,导致我原来的配置出现了问题,还有一个大问题。
我个人官网项目,前端和后端是一个项目,没有分开。
而公司项目,前端和后端是完全的2个项目。
config.json有如下配置:
"imageUrlPrefix": "", /* 图片访问路径前缀 */
"imagePathFormat": "/ueditor/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}"
我自己的项目,没有配置“图片访问路径前缀”,经实际观察,后台数据库存储的图片url就是“相对路径”,
与imagePathFormat配置基本一样。
前端访问图片的时,由于配置域名,浏览器会自动加上当前项目的路径,比如"http://localhost:8080",或者“http://fansunion.cn”。
最终的图片访问路径是个“绝对路径”,"http://localhost:8080/ueditor/upload/..."
但是公司后端系统没有部署在根目录,访问路径是"http://localhost:8080/backend",
不配置mageUrlPrefix,后台存储的虽说是相对路径,但浏览器发送的url是:
"http://localhost:8080/backend/ueditor/...",没有加上"项目名称",所总是无法正常回显。
2.7为了解决公司后端项目,图片无法回显的问题,我配置了imageUrlPrefix:"http://localhost:8080/backend"。
图片就正常显示了。
问题又来了,数据库存储的图片路径是绝对的"http://localhost:8080/backend/ueditor"。
如果我们后端项目更换了路径,就无法响应这个图片了。
除此之外,前端项目显示图片时,后端必须响应图片请求,前端和后端产生了依赖关系,这是万万不能接受的。
2.8又改成不配置“图片访问路径前缀”,只存储图片的相对路径,后端项目开发部署在“根目录下”,访问路径是:“http://localhost:8080”。
后端项目有图片请求,自己处理,前端项目自己的图片请求,自己处理,前后端2个系统没有依赖。
本以为万事大吉了,结果又跪了。
前端项目也没有部署在根目录,加上了项目名称,如:http://localhost:8080/user-center
访问图片是路径是“http://localhost:8080/ueditor/...”,把user-center项目部署在根目录,图片就正常显示的。
2.9线上实际部署的时候,不可能前端和后端2个项目,都部署在根目录下。
因此,我们最终决定,把图片单独拿成一个单独的项目,启用自己的域名。
config.json中配置图片前缀为:“http://img.a.com”,数据库存储绝对路径,显示的时候,就是“http://img.a.com/ueditor/...”。
3.百度UEditor上传图片,很简单。
但由于后端项目的配置、前端和后端项目分离、配置了SpringMVC上传,种种因素导致这个问题变得有点复杂。经过各种尝试,总是能够找到一个解决方案,只是有的能接受,有的不能接受。
我自己的项目,我说了算,很容易搞定。公司的项目,我说了不算,情况也可能多变,麻烦死了额。
小雷FansUnion-博学的互联网技术工作者
2014年11月23日
湖北武汉循礼门
原文首发:http://fansunion.cn/article/detail/525.html
百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源的更多相关文章
- 百度UEditor图片上传或文件上传路径自定义
最近在项目中使用到百度UEditor的图片以及文件上传功能,但在上传的时候路径总是按照预设规则来自动生成,不方便一些特殊文件的维护.于是开始查看文档和源代码,其实操作还是比较简单的,具体如下: 1.百 ...
- SpringBoot集成百度UEditor图片上传后直接访问404解决办法
SpringBoot项目上传图片一般是上传至远程服务器存储,开发过程中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传之后直接访问并不能被访问到,必须重新加载项目. 首先分析一下 ...
- 百度Ueditor 图片上传无反应,显示上传0张,不能点确定
解决办法: \Data\Ueditor\php\Uploader.class.php 190行左右 /** * 获取文件扩展名 * @return string */ private function ...
- ueditor图片上传插件的使用
在项目里使用到ueditor图片上传插件,以前图片上传都是直接使用js代码直接上传图片,比较麻烦,而且效率也比较低,而ueditor这款插件完美的解决了这个问题,这个是百度开发的一款富文本编辑器,在这 ...
- ueditor图片上传配置
ueditor图片上传配置文件为ueditor/php/config.json /* 上传图片配置项 */ "imageActionName": "uploadimage ...
- ThinkPHP3.1.3 整合 UEditor百度编辑器 图片上传
第一步.前端模板实例化百度编辑器 <js file='__ROOT__/Data/UEditor/ueditor.config.js' /> <js file='__ROOT__/D ...
- asp.net ueditor 图片上传路径问题解决
最近练习做一个新闻系统,其中不能少了添加新闻和修改新闻的功能 ,而且还要添加图片.添加文字样式, 所以不得不使用富文本编辑器,在kindeditor和ueditor中,选择了目前还在持续更新的百度产品 ...
- [Asp.net core 2.0]Ueditor 图片上传
摘要 在项目中要用到富文本编辑器,包含上传图片,插入视频等功能.但ueditor只有.net版本,没有支持core.那么上传等接口就需要自己实现了. 一个例子 首先去百度ueditor官网下载简化版的 ...
- springboot+UEditor图片上传
springboot+UEDitor百度编辑器整合图片上记录于此 1.下载ueditor插件包,解压到static/ueditor目录下 2.在你所需实现编辑器的页面引用三个JS文件 1) uedi ...
随机推荐
- 新手前端笔记之--css盒子
css盒子就是它的盒模型,所有css的布局都是以此作为基础的,很有必要来详细记录一下. 1.盒子的尺寸就是margin+padding+border+content的总和,这很好理解,但令人迷惑的可能 ...
- bzoj3307雨天的尾巴(权值线段树合并/DSU on tree)
题目大意: 一颗树,想要在树链上添加同一物品,问最后每个点上哪个物品最多. 解题思路: 1.线段树合并 假如说物品数量少到可以暴力添加,且树点极少,我们怎么做. 首先在一个树节点上标记出哪些物品有多少 ...
- [D3] Draw a basic US d3-geo map
Install: npm install --save d3 d3-geo topojson Code: import React, {Component} from 'react'; import ...
- Jquery获取select选中的option的文本信息
注意:以下用的$(this)代表当前选中的select框 第一种: $(this).children("option:selec... ...查看全文
- Windows Forms 窗体篇
1,显示窗体 非模式: Form form = new Form(); form.Show(); 模式: Form form = new Form(); form.Show(); 2,拥有者窗体与附属 ...
- 01011_怎么打开任务管理器?win7打开任务管理器方法
以下几种方法可以打开任务管理器 1.在系统的任务栏点击鼠标右键,然后在弹出的右键菜单中选择“启动任务管理器”: 2.同时按下这三个按钮:Ctrl + Shift + Esc: 3.同时按下键盘的Ctr ...
- asp.net--TextBox属性全研究
. .aspx代码例如以下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="T ...
- sass和less,优秀的前端样式预处理器
身为切图界的一员,或者说在前端界打滚了一段日子的你.会慢慢地发现.如今的css编写已经不能满足自己的效率. 假设有更强大的框架,让你的css更灵活和更easy复用和维护,那该多好啊.非常明显,这个早已 ...
- JS预解释的总结
预解释阶段发生在创建了堆内存,让代码执行之前,对当前作用域中带var和function的进行预解释 在浏览器解析执行代码的时候,会提前把带var和function的代码声明或定义,提前放在作用域的最前 ...
- 用多年前据说买买提上理论水平最高的帖子做镇楼贴---NASA有吹牛了
美国国会一直有意把nasa 划入国防部,取消太空探索所关联的部门,因为这些部门都是些烧钱的大包袱,而把具有军事意义的部门留下.国会想把烧钱部卖给google,可能是要价太高,最后没有谈拢,不了了之.但 ...