Kindeditor 上傳功能

 

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();

}

%>


結果圖:









相關文章
相關標籤/搜索