ckeditor之java文件下传与文件浏览

ckeditor之java文件上传与文件浏览
fckeditor升级到ckeditor已经有一段时间了,据了解ckeditor架构更合理,所以最近打算将原先fckeditor的编辑器换成ckeditor。
在使用中发现原本fckeditor支持的java图片上传和浏览的功能在ckeditor里并没有给出实现,而是由ckfinder组件所代替(目前支持 asp,asp.net,cfm,php),貌似歧视java,好在官方给出了接口文档  http://docs.cksource.com/CKEditor_3.x/Developers_Guide/File_Browser_%28Uploader%29 。

文件上传
通过文档我们了解到 只要我们可以实现一个用于接收上传文件请求的 servler(jsp,action)都可以,接收一个上传文件的请求,并返回文件处理的url位置及显示在编辑器中的位置的回调函数(window.opener.CKEDITOR.tools.callFunction( funcNum, fileUrl [, data] );)即可。
CKEDITOR.replace( 'editor_kama',
	{
		customConfig : 'custom/myCkConfig.js',
		skin : 'kama',
		//filebrowserUploadUrl : '/uploader/upload.php', 换成我们处理上传文件的url即可
		filebrowserImageUploadUrl : 'servlet/FileUpload'
	});

实际上ckeditor在提交上传文件请求的同事还会传递位置CKEditorFuncNum 语言langCode 的参数。
这里我们在servlet中主要用到CKEditorFuncNum
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=UTF-8");  
response.setHeader("Cache-Control", "no-cache");  
PrintWriter out = response.getWriter();
//判断提交的请求是否包含文件
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//设置上传的保存路径
String uploadDir = getServletContext().getRealPath("/upload");
if (uploadDir == null)
{
	System.out.println("无法访问存储目录");
	return;
}
File fUploadDir = new File(uploadDir);
if(!fUploadDir.exists())
{
	if(!fUploadDir.mkdir())
	{
		System.out.println("无法创建存储目录!");
		return;
	}
}
Date date = new Date();
String dsr = dirFormat.format(date);
File dirfile = new File(fUploadDir,dsr);
if(!dirfile.exists()){
	if(!dirfile.mkdir()){
		System.out.println("无法创建存储路径");
		return;
	}
}

DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存中最大存储5M,超过则保存到临时文件夹下
factory.setSizeThreshold(1024*1024*5);
//设置临时文件夹地址
factory.setRepository(new File("/"));
ServletFileUpload upload = new ServletFileUpload(factory);
//设置最大上传的文件大小 3M
upload.setSizeMax(1024*1024*3);
String fileName = "";
for(int k =0;k<100;k++){
	if(k==50){
		continue;
	}
}
List <FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while(iter.hasNext()){
	FileItem item = iter.next();
	if(item.isFormField()){
		System.out.println("不是上传的文件");
	}else{
		System.out.println(item.getName());
		//System.out.println(item.getString());
		String[] strs = item.getName().split("\\.");
		
		System.out.println(strs[strs.length-1]);
		fileName = filenameFormat.format(date)+"."+strs[strs.length-1];
		File nFile = new File(dirfile,fileName);
	    item.write(nFile);
	}
}
String fileUrl = "upload/"+dsr+"/"+fileName;
//CKEditorFuncNum就是在提交上传文件的同时传递到后台的request内容,表明应该插入到编辑器中的位置
String callback = request.getParameter("CKEditorFuncNum");  
out.println("<script type=\"text/javascript\">");  
out.println("window.parent.CKEDITOR.tools.callFunction(" + callback  
+ ",'" + fileUrl + "',''" + ")");  
out.println("</script>");
out.flush();  
out.close(); 

这里前部分就是采用fileupload处理上传文件,后部分就是给ckeditor的回调函数。               长春在线
实际上后台文件浏览的原理也一样,会在另一篇文章介绍给大家。