最近在写一个新闻发布后台,使用了百度的ueditor开源框架。项目是使用的freemarker做模板,官方只有jsp版,而且上传文件是配置的springmvc自带的,ueditor上传文件是使用的commons-fileupload。所以其中遇到了一些问题,现在把遇到的问题和解决方法写来了,希望对大家能有所帮助。
博主下载下来ueditor,然后把ueditor文件夹放到项目的根目录
然后按照官方给的说明去访问
http://localhost:8080/xx/ueditor/jsp/controller.jsp?action=config
发现并没有返回给我们json数据,而是把jsp的源码给读出来了,
原因:我们使用的freemarker做模板,所以说jsp不会被编译
解决方法:看一下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() );
%>
最后是调用
com.baidu.ueditor.ActionEnter 这个类的
exec()方法。
既然不能使用jsp,那我们就写一个controller来调用com.baidu.ueditor.ActionEnter 这个类的exec()方法
@RequestMapping(value = "ueditor/config/getConfig.fhtml")
@ResponseBody
public String config(HttpServletRequest request) {
//项目根目录
String rootPath = request.getSession().getServletContext()
.getRealPath("/");
return new ActionEnter(request, rootPath).exec();
}
这样就能达到和jsp相同的效果了
然后我们在ueditor.config.js这个文件中找到serverUrl: URL + "jsp/controller.jsp"这一行 ,把jsp/controller.jsp修改为/config/getConfig.fhtml
注意此处controller的请求地址为ueditor/config/getConfig.fhtml,那么我们就应该把config.json文件放到ueditor/config文件夹内,因为ueditor是根据请求路径去寻找config.json
重启项目后你会发现上传图片的功能可以使用了,然后兴致勃勃的去使用上传图片
于是博主又去阅读ueditor的源码了,读到最后发现com.baidu.ueditor.upload.BinaryUploader 这个类就是处理上传文件的
package com.baidu.ueditor.upload;
import com.baidu.ueditor.PathFormat;
import com.baidu.ueditor.define.AppInfo;
import com.baidu.ueditor.define.BaseState;
import com.baidu.ueditor.define.FileType;
import com.baidu.ueditor.define.State;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class BinaryUploader {
public static final State save(HttpServletRequest request,
Map conf) {
FileItemStream fileStream = null;
boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;
if (!ServletFileUpload.isMultipartContent(request)) {
return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);
}
ServletFileUpload upload = new ServletFileUpload(
new DiskFileItemFactory());
if ( isAjaxUpload ) {
upload.setHeaderEncoding( "UTF-8" );
}
try {
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
fileStream = iterator.next();
if (!fileStream.isFormField())
break;
fileStream = null;
}
if (fileStream == null) {
return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);
}
String savePath = (String) conf.get("savePath");
String originFileName = fileStream.getName();
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[]) conf.get("allowFiles"))) {
return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);
}
savePath = PathFormat.parse(savePath, originFileName);
String physicalPath = (String) conf.get("rootPath") + savePath;
InputStream is = fileStream.openStream();
State storageState = StorageManager.saveFileByInputStream(is,
physicalPath, maxSize);
is.close();
if (storageState.isSuccess()) {
storageState.putInfo("url", PathFormat.format(savePath));
storageState.putInfo("type", suffix);
storageState.putInfo("original", originFileName + suffix);
}
return storageState;
} catch (FileUploadException e) {
return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);
} catch (IOException e) {
}
return new BaseState(false, AppInfo.IO_ERROR);
}
private static boolean validType(String type, String[] allowTypes) {
List list = Arrays.asList(allowTypes);
return list.contains(type);
}
}
进一步读源码发现
if (fileStream == null) {
return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);//未找到上传数据
}
也就是没有在request中找到
fileStream,也就是说我们的文件流没有在request。
通过这篇文章点击打开链接发现原来是springmvc把文件请求给封装了,导致request没有fileStream。
解决方法 源码中InputStream is = fileStream.openStream(); 可以看出只要我们能够得到InputStream 就可以了,于是我们可以直接传一个File给这个方法调用
博主简单的把源码改了改,重新封装成了jar包 jar包下载地址点击打开链接 源码下载地址点击打开链接
最后修改一下我们的controller就行了
@RequestMapping(value = "ueditor/config/getConfig.fhtml")
@ResponseBody
public String config(HttpServletRequest request) {
//项目根目录
String rootPath = request.getSession().getServletContext()
.getRealPath("/");
/**判断请求类型
* 如果是文件类型请求 。from类型为'multipart/'代表上传文件请求*/
if (request instanceof MultipartHttpServletRequest) {
MultipartFile upfile =((MultipartHttpServletRequest) request).getFile("upfile");
return new ActionEnter(request, rootPath,upfile).exec();
}else{
return new ActionEnter(request, rootPath).exec();
}
}
写的有点乱,如果大家有不懂的地方,可以加我企鹅1257630851 来问我