Kindeditor支撑java,供给的示例法度由jsp充当文件经管和上传,之前应用好好的,但这次应用的struts2,而struts过滤器包装了request,对就由于这点,css
kindeditor不克不及应用了。在kindeditor论坛上有位进步前辈的描述斗劲清楚:html
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、附件,而且越简单越好。java
经由过程调试jsp页面能够知道struts2把request到底封装成什么了!web
通过分析,发现struts的ActionServlet在接收到multipart请求以后,在RequestProcessor中会对request进行封装:MultiRequestWrapper,而后在Action执行完以后,又将已经封装的request从新还原。如下是部分代码,截直RequestProcessor:apache
封装: 下面是struts的源代码:json
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文档,这个类究竟是什么!缓存
首要到了此中的一个办法:app
貌似能够得到File对象,持续调试:dom
终于发明我上传的文件了,经由过程这个File我能够直接处理惩罚上传的文件了,接下来题目就了然了!webapp
首要那个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(); } %>
结果图: