SSM项目中,使用freemaker加UEditor富文本编辑器

在一个SSM项目中使用到了UEditor富文本编辑器,但是该编辑器使用的是JSP,这个项目不使用JSP,而是使用了freemaker,查找了一些资料对UEditor进行更改。

首先是替换掉UEditor使用的controller.jsp,把该文件重命名为oldController.jsp,然后把ueditor.config.js文件中的

// 服务器统一请求接口路径
serverUrl: URL + "jsp/controller.jsp"

改为:

// 服务器统一请求接口路径
serverUrl: URL + "jsp/controller"

这里更改的原因是要使用spring mvc来拦截该请求,但是.jsp后缀的请求不会被拦截,所以更改了请求接口路径。

然后新增一个controller来处理该请求:

先看controller.jsp的内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="com.baidu.ueditor.ActionEnter"
    pageEncoding="UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%

    request.setCharacterEncoding( "utf-8" );
    response.setHeader("Content-Type" , "text/html");

    String rootPath = application.getRealPath( "/" );

    out.write( new ActionEnter( request, rootPath ).exec() );

%>

处理该请求的controller:

@Controller
@RequestMapping("/static/ueditor")
public class UEditorController {


    @RequestMapping("/jsp/controller")
    public void writePage(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
        request.setCharacterEncoding( "utf-8" );
        response.setHeader("Content-Type" , "text/html");

        String rootPath = request.getSession().getServletContext().getRealPath("/");
        response.getWriter().write(new ActionEnter(request, rootPath).exec());
    }
}

在UEditor中的ConfigManager类会使用rootPath跟请求的URL去获取配置文件config.json,如果UEditor提示未完成初始化的问题,可以Debug进去看看生成的路径是否正确,而且保存图片的路径也是由rootPath加上config.json中的imagePathFormat决定的。

到这里就已经解决了项目中没有使用JSP的问题。

但是如果增加了SpringMVC上传配置:

    id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="1000000000" />
    

那么会与UEditor自带的上传组件起冲突,我理解的原因是CommonsMultipartResolver类把HttpServletRequest 转化成MultipartHttpServletRequest了,参考了https://www.cnblogs.com/vincent4code/p/5809858.html,但是在我的程序中,该方法会导致在config.josn配置的上传路径丢失掉第一个文件夹,如”imagePathFormat”: “/ueditor/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}”,存储到本地变成目录/upload/image/{yyyy}{mm}{dd}/{time}{rand:6},依旧报未找到上传数据 ,debug了方法作出了修改,最终的方法为:

public static final State save(HttpServletRequest request, Map conf) {
        try {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
            MultipartFile multipartFile = multipartRequest.getFile(conf.get("fieldName").toString());
            String savePath = (String)conf.get("savePath");
            String originFileName = multipartFile.getOriginalFilename();
            String suffix = FileType.getSuffixByFilename(originFileName);
            originFileName = originFileName.substring(0, originFileName.length() - suffix.length());
            savePath = savePath + suffix;
            long maxSize = ((Long)conf.get("maxSize")).longValue();
            if (!validType(suffix, (String[])((String[])conf.get("allowFiles")))) {
                return new BaseState(false, 8);
            } else {
                savePath = PathFormat.parse(savePath, originFileName);
                String[] savePathBySplit_temp = savePath.split("/");
                String temp = "";
                String fileName = savePathBySplit_temp[savePathBySplit_temp.length - 1];

                for(int i = 1; i < savePathBySplit_temp.length - 1; ++i) {
                    if (i != savePathBySplit_temp.length - 2) {
                        temp = temp + savePathBySplit_temp[i] + "/";
                    } else {
                        temp = temp + savePathBySplit_temp[i];
                    }
                }

                String pathTemp = request.getSession().getServletContext().getRealPath(temp);
                System.out.println(pathTemp + "," + fileName);
                System.out.println((new File(pathTemp)).exists());
                File targetFile = new File(pathTemp);
                if (!targetFile.exists()) {
                    targetFile.mkdirs();
                }

                System.out.println((new File(pathTemp)).exists());
                State storageState = StorageManager.saveFileByInputStream(multipartFile.getInputStream(), pathTemp + "/" + fileName, maxSize);
                if (storageState.isSuccess()) {
                    storageState.putInfo("url", PathFormat.format(savePath));
                    storageState.putInfo("type", suffix);
                    storageState.putInfo("original", originFileName + suffix);
                }

                return storageState;
            }
        } catch (Exception var15) {
            var15.printStackTrace();
            System.out.println(var15.getMessage());
            return new BaseState(false, 4);
        }
    }

注意:如果项目的根路径有带上项目的名称,比如我的是:http://localhost:8080/jblog/,需要在config.json中设置”imageUrlPrefix”: “/jblog”, /* 图片访问路径前缀 */。

如果有其它问题,可以参考http://blog.csdn.net/fansunion/article/details/41420443。

你可能感兴趣的:(遇到的问题)