CKEditor3.6.4上传路径配置--java版

配置文件:

CKEDITOR.editorConfig = function( config )
{
    // 配置ckeditor的默认语言
    config.language = 'zh-cn';

    // 编辑器样式
    config.skin = 'v2';

    // 设置工具栏
    config.toolbar_Full = [
            [ 'Source', '-', 'Save', 'Preview', ],
            [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-','Print', 'SpellChecker', 'Scayt' ],
            [ 'Undo', 'Redo', '-', 'Find', 'Replace', '-', 'SelectAll','RemoveFormat' ],
            '/',
            [ 'Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript','Superscript' ],
            [ 'NumberedList', 'BulletedList', '-', 'Outdent', 'Indent' ],
            [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock' ],
            [ 'Link', 'Unlink', 'Anchor' ],
            [ 'Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley',
                    'SpecialChar', 'PageBreak' ],
            '/',
            [ 'Styles', 'Format', 'Font', 'FontSize' ],
            [ 'TextColor', 'BGColor' ]
    ];

    // 设置快捷键
    config.keystrokes = [
    [ CKEDITOR.ALT + 121, 'toolbarFocus' ], // 获取焦点
            [ CKEDITOR.ALT + 122, 'elementsPathFocus' ], // 元素焦点
            [ CKEDITOR.SHIFT + 121, 'contextMenu' ], // 文本菜单
            [ CKEDITOR.CTRL + 90, 'undo' ],// 撤销
            [ CKEDITOR.CTRL + 89, 'redo' ], // 重做
            [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90, 'redo' ],
            [ CKEDITOR.CTRL + 76, 'link' ],// 链接
            [ CKEDITOR.CTRL + 66, 'bold' ],// 粗体
            [ CKEDITOR.CTRL + 73, 'italic' ], // 斜体
            [ CKEDITOR.CTRL + 85, 'underline' ], // 下划线
            [ CKEDITOR.ALT + 109, 'toolbarCollapse' ]
    ]

    // 设置默认字体
    config.font_defaultLabel = 'Arial';
    // 设置字体种类
    config.font_names = 'Arial;黑体;宋体;仿宋;GB_2312';
    // 换行方式
    config.enterMode = CKEDITOR.ENTER_BR;
    // 当输入:shift+Enter是插入的标签
    config.shiftEnterMode = CKEDITOR.ENTER_BR;
    //请求路径:
    //config.baseHref = 'http://localhost:8080/ckps/';
    // 配置文件上传和显示路径
    config.filebrowserBrowseUrl = 'servlet/BrowerUpload';
    config.filebrowserUploadUrl = 'servlet/CKEditorUpload';
    config.filebrowserImageUploadUrl = 'servlet/CKEditorUpload?type=Images';
    config.filebrowserFlashUploadUrl = 'servlet/CKEditorUpload?type=Flashs';
    config.filebrowserImageBrowseUrl = 'servlet/BrowerUpload?type=Images';
    config.filebrowserFlashBrowseUrl = 'servlet/BrowerUpload?type=Flashs';
};

java的我们用servlet来进行文件上传的实现,其实网上已经有普通用的版本了,但是,总是多少有路径的限制问题,我自己研究了一早上,终于攻克了这个让人恶心的问题。我的博客里有3篇CKEditor的配置和应用的文章,那个是从别人的博文里拷贝的。起初写了个小demo,测试了下,可以用。上传功能用的是的jsp实现。我一般这些东西都会换着路径来测试可否正常使用的。果然,我新建了文件夹,放到非根目录,就有了路径问题了,无法实现任意路径的正常上传了。然后我继续网上查资料,发现有用servlet实现的。就参考了下,果然。还是根目录可以,非根目录还是不行。细节就不多说了。我的解决方法是用的servlet,因为servlet的路径可以配置成扩展模式,可以方便非根路径的映射。下面就是代码展示了:

前端:

<body>
      <div style="width:671px;">
      <form action="<%=path %>/UploadA" method="post">
            <textarea cols="80" id="content" name="content"></textarea>
            <script type="text/javascript"> 
                CKEDITOR.replace('content',{
                filebrowserImageBrowseUrl : 'servlet/BrowerUpload.brower',
                filebrowserImageUploadUrl:'servlet/CKEditorUpload.upload'});
            </script>
            <input type="submit" value="提交"/>
      </form>
    </div>
  </body>

web.xml

<servlet>
    <servlet-name>CKEditorUpload</servlet-name>
    <servlet-class>com.xxx.util.CKEditorUpload</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BrowerUpload</servlet-name>
    <servlet-class>com.xxx.util.BrowerUpload</servlet-class>
  </servlet>
  
<servlet-mapping>
    <servlet-name>CKEditorUpload</servlet-name>
    <url-pattern>*.upload</url-pattern>
  </servlet-mapping>
 <servlet-mapping>
    <servlet-name>BrowerUpload</servlet-name>
    <url-pattern>*.brower</url-pattern>
  </servlet-mapping>

后台:上传的servlet:com.xxx.util.CKEditorUpload

package com.xxx.util;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class CKEditorUpload extends HttpServlet {
    private static final long serialVersionUID = -7339187468470294712L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-ss");
        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 = sdf.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 = null;
        try {
            items = upload.parseRequest(request);
        } catch (FileUploadException e1) {
            e1.printStackTrace();
        }  
        Iterator<FileItem> iter = items.iterator();  
        while(iter.hasNext()){  
            FileItem item = iter.next();  
            if(item.isFormField()){  
                System.out.println("不是上传的文件");  
            }else{  
                String[] strs = item.getName().split("\\.");  
                fileName = sdf.format(date)+Math.random()*30+"."+strs[strs.length-1];
                File nFile = new File(dirfile,fileName);  
                try {
                    item.write(nFile);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }  
        }
        String uri = request.getRequestURI();
        String fileUrl = uri.substring(0,uri.indexOf("ckp")+4)+"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();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

后台:浏览的servlet:com.xxx.util.BrowerUpload

package com.xxx.util;

import java.io.File;  
import java.io.IOException;  
import java.io.PrintWriter;  
  
import javax.servlet.ServletException;  
import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
public class BrowerUpload extends HttpServlet {  
    private static final long serialVersionUID = 7132717169084340320L;

    public BrowerUpload() {  
        super();  
    }  
  
    public void destroy() {  
        super.destroy();
    }  
  
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        String callback = request.getParameter("CKEditorFuncNum");  
        System.out.println(callback);  
        response.setContentType("text/html");  
        PrintWriter out = response.getWriter();  
        out.println("<script type='text/javascript'>");  
        out.println("function tt(obj){");  
        out.println("window.opener.CKEDITOR.tools.callFunction("+callback+",obj)");  
        out.println("window.close();");  
        out.println("}");
        out.println("</script>");  
        String uploadDir = getServletContext().getRealPath("/upload");  
        File file = new File(uploadDir);  
        if(!file.exists()){  
            file.mkdir();  
        }  
        File[] files = file.listFiles();  
        for(File f:files){  
            if(f.isDirectory()){  
                out.print(f.getName());  
                File[] filesc = f.listFiles();  
                for(File fc: filesc){  
                    out.print("<div onclick =tt('"+"upload/"+f.getName()+"/"+fc.getName()+"','')>");  
                    out.print("upload/"+f.getName()+"/"+fc.getName());  
                    out.print("</div>");  
                }  
            }  
        }  
        out.flush();  
        out.close();  
          
    }  
  
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
        doGet(request, response);  
    }
  
}  

这样就可以了。前端代码可以写在任何路径下。只要servlet的匹配模式写正确就没有问题了。

posted @ 2012-12-21 13:59  矢风快乐  阅读(4015)  评论(0编辑  收藏  举报