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(); } %>
結果圖: