Kindeditor 上传功能

半城伤御伤魂 提交于 2019-12-06 19:47:57

 

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

}

%>


结果图:









易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!