Kindeditor一直比較喜歡,國產免費開源,界面也很清爽,主要是功能很強大,以后工作了一定要贊助下!
Kindeditor支持java,提供的示例程序由jsp充當文件管理和上傳,以前使用好好的,但這次使用的struts2,而struts過濾器包裝了request,對就因為這點,
kindeditor不能使用了。在kindeditor論壇上有位前輩的描述比較清楚:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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報服務器錯誤。
為什么取不到值,是因為:struts 2 過濾訪問的jsp時,會改變reqeust的類型,由HttpServletRequest變成MultiPartRequestWrapper,所以parseRequest就返回了null。
既然在過濾的時候改變reqeust的類型,那就可以修改web.xml不過濾jsp。但是如果在jsp中用到了struts 2 的標簽就會報 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到底封裝成什么了!
于是查看struts2文檔,這個類到底是什么!
主要到了其中的一個方法:
貌似可以得到File對象,繼續調試:
終于發現我上傳的文件了,通過這個File我可以直接處理上傳的文件了,接下來問題就明了了!
主要那個maxSize是我通過在struts.xml中配置的,默認是十幾M吧!
上代碼:
struts.xml配置struts所有文件上傳的大小,如果上傳視頻和附件最好配置大點:
kindeditor4.0.3修改之后的文件(upload_json.jsp):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | <%@ 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(); } %> |
效果圖:
個人環境:win7+tomcat6+myelipse9.0+struts2.2.3+spring3.0+hibernate3.6+kindeditor4.0.3