Kindeditor支撑java,供给的示例法度由jsp充当文件经管和上传,以前应用好好的,但此次应用的struts2,而struts过滤器包装了request,对就因为这点,
kindeditor不克不及应用了。在kindeditor论坛上有位进步前辈的描述斗劲清楚:
kindeditor 在java景象顶用到了 commons-fileupload-1.2.1.jar 组件。
在Common- FileUpload中,它把从客户端提交过来的表单封装成一个个FileItem对象,这也是它实现文件上传功能 的核心类。另一个很首要的类就是FileUploadBase,他的功能就是解析恳求(request),如进行上传文 件大小验证,恳求类型验证(文件上传的enctype要设置成multipart/form-data)等。我们经常用到它 的子类ServletFileUpload。在FileUploadBase解析 request的过程中会将文件保存到内存,若是文件大 小大于我们设置的缓存的大小,它将把文件的其他内容保存到一个姑且目次,当我们对FileItem 对象实 现正真上传时会从内存区或姑且目次将文件保存到正真的上传目次。
在kindeditor上传图片调试过程中,发明
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
Iterator itr = items.iterator();
while (itr.hasNext()) {
发明代码4,items为空,取不到须要上传的文件,故没有履行while轮回,也就没有返回值,kindeditor报办事器错误。
为什么取不到值,是因为:struts2过滤接见的jsp时,会改变reqeust的类型,由HttpServletRequest变成MultiPartRequestWrapper,所以parseRequest就返回了null。
既然在过滤的时辰改变reqeust的类型,那就可以批改web.xml不过滤jsp。然则若是在jsp顶用到了struts2的标签就会报500的错误,这个规划在我的应用中不实用。
终极解决规划是,写个Servlet来庖代upload_json.jsp的功能。upload_json.jsp里面的代码大项目组都可以复制到Servlet中, upload_json.jsp中的out.prinln返回值用 resp.getWriter().println()庖代就行。
jsp调用是,批改imageUploadJson的路径即可(用的版本是kindeditor-3.5.5,因为KindEditor 4.0 beta与我用到的mootools有冲突,已经提交bug)。
KE.show({
id : ""noticeContent"",
imageUploadJson : ""<ui:webroot/>/fileUploadServlet?uploadTool=kindeditor"",
fileManagerJson : ""<ui:webroot/>/js/kindeditor3.5.5/file_manager_json.jsp"",
allowFileManager : true
});
测验测验了他的办法,但我的项目一向无法接见到servlet,直接给struts2阻碍了,也不是servlet在web.xml题目,思疑是struts2版起原根蒂根基因吧!网上有措辞把struts的url-pattern改为*.action,不知道他的struts什么版本,我的直接启动报异常,我把url-pattern改为/*.action固然不报异常了,但很多404了。在网上又看见了kindeditor插件项目KEPlugin,应用action上传解决了struts2中kindeditor题目,但对方应用的kindeditor3.6,对视频和flash支撑不是很友爱。参考网上思路决意本身把kindeditor4.0+版本与struts2兼容题目解决,使kindeditor支撑上传图片、视频、FLASH、附件,并且越简单越好。
经由过程调试jsp页面可以知道struts2把request到底封装成什么了!
经过分析,发现struts的ActionServlet在接收到multipart请求之后,在RequestProcessor中会对request进行封装:MultiRequestWrapper,然后在Action执行完之后,又将已经封装的request重新还原。以下是部分代码,截直RequestProcessor:
封装: 下面是struts的源代码:
protected HttpServletRequest processMultipart(HttpServletRequest request) {
if (!"POST".equalsIgnoreCase(request.getMethod())) {
return (request);
}
String contentType = request.getContentType();
if ((contentType !=null) &&
contentType.startsWith("multipart/form-data")) {
return (new MultipartRequestWrapper(request));
}else{
return (request);
}
}
于是查看struts2文档,这个类到底是什么!
首要到了此中的一个办法:
貌似可以获得File对象,持续调试:
终于发明我上传的文件了,经由过程这个File我可以直接处理惩罚上传的文件了,接下来题目就了然了!
首要那个maxSize是我经由过程在struts.xml中设备的,默认是十几M吧!
上代码:
struts.xml设备struts所有文件上传的大小,若是上传视频和附件最好设备大点:
kindeditor4.0.3批改之后的文件(upload_json.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.json.simple.*" %>
<%@ page import="org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper" %>
<%
//文件保存目次路径
//D:\Tomcat6.0\webapps\zswz\attached/
String savePath = request.getSession().getServletContext().getRealPath("/") + "attached/";
//文件保存目次URL /zswz/attached/
String saveUrl = request.getContextPath() + "/attached/";
//定义容许上传的文件扩大名
//定义容许上传的文件扩大名
HashMap<String, String> extMap = new HashMap<String, String>();
extMap.put("image", "gif,jpg,jpeg,png,bmp");
extMap.put("flash", "swf,flv");
extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
//容许最大上传文件大小 struts.xml struts.multipart.maxSize=3G
long maxSize = 3000000000l;
response.setContentType("text/html; charset=UTF-8");
if(!ServletFileUpload.isMultipartContent(request)){
out.println(getError("请选择文件。"));
return;
}
//搜检目次
File uploadDir = new File(savePath);
if(!uploadDir.isDirectory()){
out.println(getError("上传目次不存在。"));
return;
}
//搜检目次写权限
if(!uploadDir.canWrite()){
out.println(getError("上传目次没有写权限。"));
return;
}
String dirName = request.getParameter("dir");//image
if (dirName == null) {
dirName = "image";
}
if(!extMap.containsKey(dirName)){
out.println(getError("目次名不正确。"));
return;
}
//创建文件夹
savePath += dirName + "/";//D:\Tomcat6.0\webapps\zswz\attached/image/
saveUrl += dirName + "/";///zswz/attached/image/
File saveDirFile = new File(savePath);
if (!saveDirFile.exists()) {
saveDirFile.mkdirs();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf.format(new Date());
savePath += ymd + "/";//D:\Tomcat6.0\webapps\zswz\attached/image/20111129/
saveUrl += ymd + "/";///zswz/attached/image/20111129/
File dirFile = new File(savePath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
if (!dirFile.isDirectory()) {
out.println(getError("上传目次不存在 。"));
return;
}
//搜检目次写入权限
if (!dirFile.canWrite()) {
out.println(getError("上传目次没有写入权限。"));
return;
}
//Struts2 恳求 包装过滤器
MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
//获得上传的文件名
String fileName = wrapper.getFileNames("imgFile")[0];//imgFile,imgFile,imgFile
//获得文件过滤器
File file = wrapper.getFiles("imgFile")[0];
//搜检扩大名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
if(!Arrays.<String>asList(extMap.get(dirName).split(",")).contains(fileExt)){
out.println(getError("上传文件扩大名是不容许的扩大名。\n只容许" + extMap.get(dirName) + "格局。"));
return;
}
//搜检文件大小
if (file.length() > maxSize) {
out.println(getError("上传文件大小跨越限制。"));
return;
}
//重构上传图片的名称
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
String newImgName = df.format(new Date()) + "_"
+ new Random().nextInt(1000) + "." + fileExt;
byte[] buffer = new byte[1024];
//获取文件输出流
FileOutputStream fos = new FileOutputStream(savePath +"/" + newImgName);
//获取内存中当前文件输入流
InputStream in = new FileInputStream(file);
try {
int num = 0;
while ((num = in.read(buffer)) > 0) {
fos.write(buffer, 0, num);
}
} catch (Exception e) {
e.printStackTrace(System.err);
} finally {
in.close();
fos.close();
}
//发送给 KE
JSONObject obj = new JSONObject();
obj.put("error", 0);
obj.put("url", saveUrl +"/" + newImgName);
///zswz/attached/image/20111129/ image 20111129195421_593.jpg
out.println(obj.toJSONString());
%>
<%!
private String getError(String message) {
JSONObject obj = new JSONObject();
obj.put("error", 1);
obj.put("message", message);
return obj.toJSONString();
}
%>
结果图:
来源:oschina
链接:https://my.oschina.net/u/104775/blog/40708