项目中使用UEditor编辑器作为富文本编辑器,用起来挺好。但随着文件服务器的搭建,项目中图片文件以及其它一下小文件被独立存储之后,UEditor用起来就不那么爽了。
如果不做点改动的话,所有通过UEditor上传的文件,还是存储在项目中的/ueditor/jsp/upload/目录下(默认配置),无法和文件服务器配合使用。
所以改动是必然的,具体操作步骤如下:
1、找切入点。
ueditor.config.js中配置了服务器统一请求接口路径。这个就是突破口。

这个controller.jsp究竟是个啥东东,打开一看便知:

由上面划红线的代码可以看出,其实真正的“幕后黑手”是 com.baidu.ueditor.ActionEnter (ueditor-1.1.1.jar中,源码官网下载的源码包中也有)。
2、打开com.baidu.ueditor.ActionEnter,你就发现invoke方法中统一了文件上传和列表显示文件的类和方法。

3、由以上两点可以看出,只需要从ActionEnter,Uploader,FileManager这三个类入手即可。
接着追踪代码,结合搞这个扩展的出发点(从UEditor中分离文件存储和文件访问),发现只需要把怎样获取表单中提交的文件流,如何存储文件,如何访问文件,这三个问题搞定即可。
结合ueditor的源码,定义了如下接口:
1package net.viservice.editor.ueditor; 2 3import javax.servlet.http.HttpServletRequest; 4 5import net.viservice.editor.MultipartFile; 6 7import com.baidu.ueditor.define.State; 8 9public interface UeditorService { 10 11 /** 12 * 获取上传的文件 13 * 14 * @param filedName 15 * 参数名 16 * @param request 17 * @return 18 */ 19 public MultipartFile getMultipartFile(String filedName, HttpServletRequest request); 20 21 /** 22 * 存储文件 23 * 24 * @param multipartFile 25 * @param maxSize 26 * @return 27 */ 28 public State saveFileByInputStream(MultipartFile multipartFile, long maxSize); 29 30 /** 31 * 存储文件 32 * 33 * @param data 34 * @param fileName 35 * @return 36 */ 37 public State saveBinaryFile(byte[] data, String fileName); 38 39 /** 40 * 获取文件列表 41 * 42 * @param allowFiles 43 * 允许显示的文件 44 * @param start 45 * 起始位置 46 * @param pageSize 47 * 每页显示条数 48 * @return 49 */ 50 public State listFile(String[] allowFiles, int start, int pageSize); 51 52}
这样就分离了文件的存储和访问。可以自由实现UeditorService接口,完成自己的应用与文件服务器或者云存储服务的结合了。