当前位置: 代码迷 >> JavaScript >> ckeditor在jsp上增加图片下传功能(2)
  详细解决方案

ckeditor在jsp上增加图片下传功能(2)

热度:595   发布时间:2012-11-01 11:11:31.0
ckeditor在jsp下增加图片上传功能(2)
     之前写的文章http://fzlihui.iteye.com/admin/blogs/749437说明了如何在jsp中手动开启ckeditor的图片上传,但是毕竟是自己写的上传界面,实在是丑。查了更多资料,发现还有更好更简单的方法。

     之前参考的http://blog.163.com/ytrtfhj@126/blog/static/890531092010226023136/和
http://topic.csdn.net/u/20100127/11/d2254308-db90-4b1f-adca-b36bd8956264.html
都尝试开启ckeditor默认的图片上传,但是都没能成功上传到后台,这可能是由于他们回调函数调用错误。

   感谢http://sarin.iteye.com/blog/599499的作者,他的方法最简单美观,也解决了最根本的问题。






   总结了下其实开启上传功能非常简单,前台只需要以下代码:
//这后面加的参数分别是上传文件,图片和flash
			CKEDITOR.replace( 'context',{filebrowserUploadUrl : 'ckupload.do?type=file',   
				filebrowserImageUploadUrl : 'ckupload.do?type=image',   
				filebrowserFlashUploadUrl : 'ckupload.do?type=flash'  
		    });


后台可以用apache commons组件中的fileupload和io包进行上传操作
用struts1.2简单写了后台,注意struts1.2自带的包里缺少一些方法,要加入附件的包。

package info.hellolihui.action;

import java.io.File;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;



public class CKUploadAction extends DispatchAction {

	//允许上传的文件后缀名
	private final String[] exts = new String[]{"gif","png","jpeg","jpg","bmp"}; 
	
	@Override
	public ActionForward unspecified(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		System.out.println("上传");
		
		ServletContext servletContext = request.getSession().getServletContext();
		
		// 设定上传文件路径
		String path = servletContext.getRealPath("/upload") + "/";
		
		String typeStr = request.getParameter("type");   
		//如果type为空则默认为上传文件
        if (typeStr == null) {   
            typeStr = "file";   
        } 
        path += typeStr;
		
        // 判断文件夹是否存在,不存在则创建,此时的path还未加上文件名,为http://127.0.0.1:8080/xx/upload的格式
        File dirTest = new File(path);   
        if (!dirTest.exists()) {   
            dirTest.mkdirs();   
        }   
       
        System.out.println(path);
		
        //使用Apache Common组件中的fileupload进行文件上传   
        FileItemFactory factory = new DiskFileItemFactory();   
        ServletFileUpload upload = new ServletFileUpload(factory);   
        
        // 文件名和文件真实路径   
        String newName = "";   
        String fileUrl = "";   
        String fileName = ""; //只有文件名
        try {   
            List items = upload.parseRequest(request);   
            Map fields = new HashMap();   
            Iterator iter = items.iterator();   
            while (iter.hasNext()) {   
                FileItem item = (FileItem) iter.next();   
                if (item.isFormField())   
                    fields.put(item.getFieldName(), item.getString());   
                else  
                    fields.put(item.getFieldName(), item);   
            }   
            // CEKditor中file域的name值是upload   
            FileItem uplFile = (FileItem) fields.get("upload");   
            // 获取文件名并做处理   
            String fileNameLong = uplFile.getName();   
            fileNameLong = fileNameLong.replace('\\', '/');   
            String[] pathParts = fileNameLong.split("/");   
            fileName = pathParts[pathParts.length - 1];   
            // 获取文件扩展名   
            String ext = getExtension(fileName);   
            // 设置上传文件名以时间命名
            fileName = new Date().getTime() + "." + ext;   
            // 获取文件名(无扩展名)   
            String nameWithoutExt = getNameWithoutExtension(fileName);   
            File pathToSave = new File(path, fileName);   
            fileUrl = path + "/" + fileName;   
            if (extIsAllowed(ext)) {   
                int counter = 1;   
                while (pathToSave.exists()) {   
                    newName = nameWithoutExt + "_" + counter + "." + ext;   
                    fileUrl = path + "/" + newName;   
                    pathToSave = new File(path, newName);   
                    counter++;   
                }   
                uplFile.write(pathToSave);   
            } else {   
                System.out.println("无效的文件类型: " + ext);   
            }   
        }catch (Exception ex) {   
           ex.printStackTrace();   
        }   
        PrintWriter out = response.getWriter();   

        // CKEditorFuncNum是回调时显示的位置,这个参数必须有   
        //不能存d:\这种地址,要url
		String url = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/upload/" + typeStr + "/" + fileName;
        String callback = request.getParameter("CKEditorFuncNum");   
        out.println("<script type=\"text/javascript\">");   
        out.println("window.parent.CKEDITOR.tools.callFunction(" + callback   
                + ",'" + url + "',''" + ")");   
        out.println("</script>");   
        out.flush();   
        out.close();   

        
		return null;

	}

    /**  
	 * 获取文件名的方法  
	 */
	private static String getNameWithoutExtension(String fileName) {
		return fileName.substring(0, fileName.lastIndexOf("."));
	}

	/**  
	 * 获取扩展名的方法  
	 */
	private String getExtension(String fileName) {
		return fileName.substring(fileName.lastIndexOf(".") + 1);
	}

	/**  
	 * 判断扩展名是否允许的方法  
	 */
	private boolean extIsAllowed(String ext) {
		ext = ext.toLowerCase();
		List extList = Arrays.asList(this.exts);
		return extList.contains(ext)?true:false;
	}   


}

1 楼 sarin 2010-08-31  
http://sarin.iteye.com/blog/599499
我们写的方法都好像啊,哈哈。
不过为什么不在XML中配置允许的扩展名呢?
写成Struts的Action,在应用中还得拦截请求吧。
2 楼 fzlihui 2010-08-31  
sarin 写道
http://sarin.iteye.com/blog/599499
我们写的方法都好像啊,哈哈。
不过为什么不在XML中配置允许的扩展名呢?
写成Struts的Action,在应用中还得拦截请求吧。

我就是用你的方法稍微改了改测试,配置允许扩展名是我偷懒了 你的做法是对的
3 楼 lyp_t2010 2011-07-18  
上传
D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\jiaiu\upload/Image
2011-7-18 10:54:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.NoSuchMethodError: org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(Lorg/apache/commons/fileupload/RequestContext;)Ljava/util/List;
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at jiaiu.web.action.CKUploadAction.unspecified(CKUploadAction.java:65)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:258)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.et.mvc.DispatcherFilter.doFilter(DispatcherFilter.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)
4 楼 lyp_t2010 2011-07-18  
lyp_t2010 写道
上传
D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\jiaiu\upload/Image
2011-7-18 10:54:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.NoSuchMethodError: org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(Lorg/apache/commons/fileupload/RequestContext;)Ljava/util/List;
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at jiaiu.web.action.CKUploadAction.unspecified(CKUploadAction.java:65)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:258)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.et.mvc.DispatcherFilter.doFilter(DispatcherFilter.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)

lyp_t2010 写道
上传
D:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\jiaiu\upload/Image
2011-7-18 10:54:33 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet action threw exception
java.lang.NoSuchMethodError: org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(Lorg/apache/commons/fileupload/RequestContext;)Ljava/util/List;
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at jiaiu.web.action.CKUploadAction.unspecified(CKUploadAction.java:65)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:258)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.et.mvc.DispatcherFilter.doFilter(DispatcherFilter.java:220)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:619)



大侠,我的怎么出现这种情况
5 楼 wyb1314 2012-04-24  
大侠,我的报错怎么回事?
16:08:47,187 INFO  [STDOUT] 上传
16:08:47,187 INFO  [STDOUT] D:\developtool\jboss-4.2.2.GA\server\default\.\deploy\qdsp.war\upload/file
16:08:47,187 ERROR [STDERR] java.lang.NullPointerException
16:08:47,187 ERROR [STDERR] at com.bluestar.bly.relics.action.CKUploadAction.execute(CKUploadAction.java:77)
16:08:47,187 ERROR [STDERR] at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
16:08:47,187 ERROR [STDERR] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
16:08:47,187 ERROR [STDERR] at com.bluestar.system.servlet.MyActionServlet.process(MyActionServlet.java:90)
16:08:47,187 ERROR [STDERR] at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
16:08:47,187 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
16:08:47,187 ERROR [STDERR] at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
16:08:47,187 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
16:08:47,187 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
16:08:47,218 ERROR [STDERR] at com.bluestar.ext.filter.SetEncodingFilter.doFilter(SetEncodingFilter.java:61)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
16:08:47,218 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
16:08:47,218 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
16:08:47,218 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
16:08:47,218 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
16:08:47,218 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
16:08:47,218 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
16:08:47,218 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
16:08:47,218 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
16:08:47,218 ERROR [STDERR] at java.lang.Thread.run(Thread.java:619)
  相关解决方案