zoukankan      html  css  js  c++  java
  • 我的fckeditor实践

     一开始我不懂这个ConnectorServlet是何用处,后来发现是专门用于文件上传的,因为fckeditor默认是不支持这个功能的。

    ConnectorServlet:

    /*
     * FCKeditor - The text editor for Internet - http://www.fckeditor.net
     * Copyright (C) 2003-2008 Frederico Caldeira Knabben
     * 
     * == BEGIN LICENSE ==
     * 
     * Licensed under the terms of any of the following licenses at your
     * choice:
     * 
     *  - GNU General Public License Version 2 or later (the "GPL")
     *    http://www.gnu.org/licenses/gpl.html
     * 
     *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
     *    http://www.gnu.org/licenses/lgpl.html
     * 
     *  - Mozilla Public License Version 1.1 or later (the "MPL")
     *    http://www.mozilla.org/MPL/MPL-1.1.html
     * 
     * == END LICENSE ==
     */
    package com.sanqing.fckeditor;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import net.fckeditor.connector.Messages;
    import net.fckeditor.handlers.CommandHandler;
    import net.fckeditor.handlers.ConnectorHandler;
    import net.fckeditor.handlers.ExtensionsHandler;
    import net.fckeditor.handlers.RequestCycleHandler;
    import net.fckeditor.handlers.ResourceTypeHandler;
    import net.fckeditor.response.UploadResponse;
    import net.fckeditor.response.XmlResponse;
    import net.fckeditor.tool.Utils;
    import net.fckeditor.tool.UtilsFile;
    import net.fckeditor.tool.UtilsResponse;
    
    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.commons.io.FilenameUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * Servlet to upload and browse files.<br />
     * 
     * This servlet accepts 4 commands which interact with the server-side
     * filesystem.<br />
     * The allowed commands are:
     * <ul>
     * <li><code>GetFolders</code>: Retrieves a list of folders in the current
     * folder</li>
     * <li><code>GetFoldersAndFiles</code>: Retrives a list of files and folders
     * in the current folder</li>
     * <li><code>CreateFolder</code>: Creates a new folder in the current folder</li>
     * <li><code>FileUpload</code>: Stores an uploaded file into the current
     * folder. (must be sent with POST)</li>
     * </ul>
     * 
     * @version $Id: ConnectorServlet.java 2101 2008-06-22 22:00:48Z mosipov $
     */
    public class ConnectorServlet extends HttpServlet {
    
        private static final long serialVersionUID = -5742008970929377161L;
        private static final Logger logger = LoggerFactory.getLogger(ConnectorServlet.class);
    
        /**
         * Initialize the servlet: <code>mkdir</code> &lt;DefaultUserFilesPath&gt;
         */
        public void init() throws ServletException, IllegalArgumentException {
            String realDefaultUserFilesPath = getServletContext().getRealPath(
                    ConnectorHandler.getDefaultUserFilesPath());
    
            File defaultUserFilesDir = new File(realDefaultUserFilesPath);
            UtilsFile.checkDirAndCreate(defaultUserFilesDir);
    
            logger.info("ConnectorServlet successfully initialized!");
        }
    
        /**
         * Manage the <code>GET</code> requests (<code>GetFolders</code>,
         * <code>GetFoldersAndFiles</code>, <code>CreateFolder</code>).<br/>
         * 
         * The servlet accepts commands sent in the following format:<br/>
         * <code>connector?Command=&lt;CommandName&gt;&Type=&lt;ResourceType&gt;&CurrentFolder=&lt;FolderPath&gt;</code>
         * <p>
         * It executes the commands and then returns the result to the client in XML
         * format.
         * </p>
         */
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            logger.debug("Entering ConnectorServlet#doGet");
    
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/xml; charset=UTF-8");
            response.setHeader("Cache-Control", "no-cache");
            PrintWriter out = response.getWriter();
    
            String commandStr = request.getParameter("Command");
            String typeStr = request.getParameter("Type");
            String currentFolderStr = request.getParameter("CurrentFolder");
    
            logger.debug("Parameter Command: {}", commandStr);
            logger.debug("Parameter Type: {}", typeStr);
            logger.debug("Parameter CurrentFolder: {}", currentFolderStr);
    
            XmlResponse xr;
    
            if (!RequestCycleHandler.isEnabledForFileBrowsing(request))
                xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.NOT_AUTHORIZED_FOR_BROWSING);
            else if (!CommandHandler.isValidForGet(commandStr))
                xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_COMMAND);
            else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr))
                xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_TYPE);
            else if (!UtilsFile.isValidPath(currentFolderStr))
                xr = new XmlResponse(XmlResponse.EN_ERROR, Messages.INVALID_CURRENT_FOLDER);
            else {
                CommandHandler command = CommandHandler.getCommand(commandStr);
                ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr);
    
                String typePath = UtilsFile.constructServerSidePath(request, resourceType);
                String typeDirPath = getServletContext().getRealPath(typePath);
    
                File typeDir = new File(typeDirPath);
                UtilsFile.checkDirAndCreate(typeDir);
    
                File currentDir = new File(typeDir, currentFolderStr);
    
                if (!currentDir.exists())
                    xr = new XmlResponse(XmlResponse.EN_INVALID_FOLDER_NAME);
                else {
    
                    xr = new XmlResponse(command, resourceType, currentFolderStr, UtilsResponse
                            .constructResponseUrl(request, resourceType, currentFolderStr, true,
                                    ConnectorHandler.isFullUrl()));
    
                    if (command.equals(CommandHandler.GET_FOLDERS))
                        xr.setFolders(currentDir);
                    else if (command.equals(CommandHandler.GET_FOLDERS_AND_FILES))
                        xr.setFoldersAndFiles(currentDir);
                    else if (command.equals(CommandHandler.CREATE_FOLDER)) {
                        String newFolderStr = UtilsFile.sanitizeFolderName(
                                new String(request.getParameter("NewFolderName").getBytes("ISO8859-1"),"UTF-8")
                                );
                        logger.debug("Parameter NewFolderName: {}", newFolderStr);
    
                        File newFolder = new File(currentDir, newFolderStr);
                        int errorNumber = XmlResponse.EN_UKNOWN;
    
                        if (newFolder.exists())
                            errorNumber = XmlResponse.EN_ALREADY_EXISTS;
                        else {
                            try {
                                errorNumber = (newFolder.mkdir()) ? XmlResponse.EN_OK
                                        : XmlResponse.EN_INVALID_FOLDER_NAME;
                            } catch (SecurityException e) {
                                errorNumber = XmlResponse.EN_SECURITY_ERROR;
                            }
                        }
                        xr.setError(errorNumber);
                    }
                }
            }
    
            out.print(xr);
            out.flush();
            out.close();
            logger.debug("Exiting ConnectorServlet#doGet");
        }
    
        /**
         * Manage the <code>POST</code> requests (<code>FileUpload</code>).<br />
         * 
         * The servlet accepts commands sent in the following format:<br />
         * <code>connector?Command=&lt;FileUpload&gt;&Type=&lt;ResourceType&gt;&CurrentFolder=&lt;FolderPath&gt;</code>
         * with the file in the <code>POST</code> body.<br />
         * <br>
         * It stores an uploaded file (renames a file if another exists with the
         * same name) and then returns the JavaScript callback.
         */
        @SuppressWarnings("unchecked")
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            logger.debug("Entering Connector#doPost");
    
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");
            response.setHeader("Cache-Control", "no-cache");
            PrintWriter out = response.getWriter();
    
            String commandStr = request.getParameter("Command");
            String typeStr = request.getParameter("Type");
            String currentFolderStr = request.getParameter("CurrentFolder");
    
            logger.debug("Parameter Command: {}", commandStr);
            logger.debug("Parameter Type: {}", typeStr);
            logger.debug("Parameter CurrentFolder: {}", currentFolderStr);
    
            UploadResponse ur;
    
            // if this is a QuickUpload request, 'commandStr' and 'currentFolderStr'
            // are empty
            if (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) {
                commandStr = "QuickUpload";
                currentFolderStr = "/";
            }
    
            if (!RequestCycleHandler.isEnabledForFileUpload(request))
                ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR, null, null,
                        Messages.NOT_AUTHORIZED_FOR_UPLOAD);
            else if (!CommandHandler.isValidForPost(commandStr))
                ur = new UploadResponse(UploadResponse.SC_ERROR, null, null, Messages.INVALID_COMMAND);
            else if (typeStr != null && !ResourceTypeHandler.isValid(typeStr))
                ur = new UploadResponse(UploadResponse.SC_ERROR, null, null, Messages.INVALID_TYPE);
            else if (!UtilsFile.isValidPath(currentFolderStr))
                ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;
            else {
                ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr);
    
                String typePath = UtilsFile.constructServerSidePath(request, resourceType);
                String typeDirPath = getServletContext().getRealPath(typePath);
    
                File typeDir = new File(typeDirPath);
                UtilsFile.checkDirAndCreate(typeDir);
    
                File currentDir = new File(typeDir, currentFolderStr);
    
                if (!currentDir.exists())
                    ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;
                else {
    
                    String newFilename = null;
                    FileItemFactory factory = new DiskFileItemFactory();
                    ServletFileUpload upload = new ServletFileUpload(factory);
                    //设置编码格式
                    upload.setHeaderEncoding("UTF-8");
                    try {
    
                        List<FileItem> items = upload.parseRequest(request);
    
                        // We upload only one file at the same time
                        FileItem uplFile = items.get(0);
                        String rawName = UtilsFile.sanitizeFileName(uplFile.getName());
                        String filename = FilenameUtils.getName(rawName);
                        String baseName = FilenameUtils.removeExtension(filename);
                        String extension = FilenameUtils.getExtension(filename);
                        //文件名自动替换
                        filename = UUID.randomUUID().toString() + "."+ extension;
                        
                        
                        if (!ExtensionsHandler.isAllowed(resourceType, extension))
                            ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION);
                        else {
    
                            // construct an unique file name
                            File pathToSave = new File(currentDir, filename);
                            int counter = 1;
                            while (pathToSave.exists()) {
                                newFilename = baseName.concat("(").concat(String.valueOf(counter))
                                        .concat(")").concat(".").concat(extension);
                                pathToSave = new File(currentDir, newFilename);
                                counter++;
                            }
    
                            if (Utils.isEmpty(newFilename))
                                ur = new UploadResponse(UploadResponse.SC_OK, UtilsResponse
                                        .constructResponseUrl(request, resourceType, currentFolderStr,
                                                true, ConnectorHandler.isFullUrl()).concat(filename));
                            else
                                ur = new UploadResponse(UploadResponse.SC_RENAMED,
                                        UtilsResponse.constructResponseUrl(request, resourceType,
                                                currentFolderStr, true, ConnectorHandler.isFullUrl())
                                                .concat(newFilename), newFilename);
    
                            // secure image check
                            if (resourceType.equals(ResourceTypeHandler.IMAGE)
                                    && ConnectorHandler.isSecureImageUploads()) {
                                if (UtilsFile.isImage(uplFile.getInputStream()))
                                    uplFile.write(pathToSave);
                                else {
                                    uplFile.delete();
                                    ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION);
                                }
                            } else
                                uplFile.write(pathToSave);
    
                        }
                    } catch (Exception e) {
                        ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR);
                    }
                }
    
            }
    
            out.print(ur);
            out.flush();
            out.close();
    
            logger.debug("Exiting Connector#doPost");
        }
    
    }

    fckeditor.properties:

    connector.userActionImpl=net.fckeditor.requestcycle.impl.UserActionImpl
    connector.userPathBuilderImpl=com.fckeditor.fckeditor.MyUserPath

    web.xml下当然要加入servlet的配置:

      <servlet>
        <servlet-name>Connector</servlet-name>
        <servlet-class>
              com.sanqing.fckeditor.ConnectorServlet
          </servlet-class>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>Connector</servlet-name>
        <url-pattern>
            /user/fckeditor/editor/filemanager/connectors/*
          </url-pattern>
      </servlet-mapping>

    fckeditor主要是用作前端的插件,以下是fckeditor的主体:

    参考文章:http://huaxia524151.iteye.com/blog/846520

    最前面的引入:<%@ taglib uri="http://java.fckeditor.net" prefix="FCK"%> 

    页面中的使用:

                  <div>
                      <label>内容:</label>
                      <FCK:editor instanceName="content" basePath="/user/fckeditor" toolbarSet="myToolbar" height="400"></FCK:editor>
                  </div>

    <%@ page language="java" contentType="text/html; charset=gb2312"
        pageEncoding="gb2312"%>
    <%@ taglib uri="http://java.fckeditor.net" prefix="FCK"%>    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
    <title>添加文章</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link type="text/css" rel="stylesheet" href="../css/main.css" media="all" />
    <!--[if IE 6]><link type="text/css" rel="stylesheet" href="css/ie6.css" media="all" /><![endif]-->
    <script type="text/javascript" src="../js/mootools.js"></script>
    <script type="text/javascript" src="../js/site.js"></script>
    </head>
    <body>
    <div id="wrapper">
      <div id="container">
        <div id="scene"> <img src="../images/scene.jpg" alt="" />
          <h1>${empty sessionScope.blogtitle ? "博客网站系统":sessionScope.blogtitle} <br/>
                  <font size="8">${empty sessionScope.idiograph ? "我的签名":sessionScope.idiograph}</font>
                  </h1>
          <div id="scale_area">
            <div id="scale_knob">&raquo; Font Size &laquo;</div>
          </div>
          <div id="menu">
            <div class="holder"> <a href="../showAllArticle.action">博客首页</a> </div>
            <div class="holder"> <a href="showUserAllArticle.action">用户首页</a> </div>
            <div class="holder"> <a href="editbloginfo.jsp">个性化设置</a> </div>
            <div class="holder"> <a href="addArticle.jsp">写日志</a> </div>
            <div class="holder"> <a href="showPhoto.action">相册</a> </div>
          </div>
        </div>
        <div id="content">
          <div id="col_left">
            <div class="post">
              <div class="meta"></div>
              <div class="comments"><div class="comment"></div>
                <h2>添加文章</h2>
                <form class="h" action="addArticle.action" method="post">
                  <div>
                    <label>标题:</label>
                    <input type="text" name="title" />
                  </div>
                  <div>
                    <label>内容:</label>
                    <FCK:editor instanceName="content" basePath="/user/fckeditor" toolbarSet="myToolbar" height="400"></FCK:editor>
                  </div>
                  <div>
                    <label></label>
                    <div class="clear"> </div>
                  </div>
                  <div class="button_wrapper">
                    <input name="提交" type="submit" class="button" value="提交" />
                  </div>
                </form>
              </div>
            </div>
          </div>
          <div id="col_right">
            <div id="search_box">
              <form action="http://www.865171.cn/" method="post">
                <div>
                  <input type="text" name="search" />
                </div>
                <div class="button_wrapper">
                  <input type="submit" value="Search" class="button" />
                </div>
                <div class="clear"> </div>
              </form>
            </div>
            <div id="sidebar">
              <h2>页面导航</h2>
              <ul>
                <li><a href="../showAllArticle.action">博客首页</a></li>
                <li><a href="showUserAllArticle.action">用户首页</a></li>
                <li><a href="editbloginfo.jsp">个性化设置</a></li>
                <li><a href="addArticle.jsp">写日志</a></li>
                   <li><a href="showPhoto.action">相册</a></li>
              </ul>
            </div>
          </div>
          <div class="clear"> </div>
        </div>
        <div id="footer">
          <div class="clear"> </div>
          <hr />
          <p class="credit">博客网站系统</p>
        </div>
      </div>
    </div>
    </body>
    </html>
  • 相关阅读:
    WF4.0 基础篇 (十九) Persistence 持久化
    WF是什么系列之 [ WF控制逻辑线路的算法]
    控制3D模型的例子
    企业信息化建设发展报告
    WF是什么系列之 [ WF控制机械手臂 (3D模型) ]
    WF4.0 RC 对比 Beta2 的变化
    企业信息化所面临的问题
    企业应用的SOA时代
    WF4.0 基础篇 (二十三) 范型Activity
    WF4.0 应用篇(三) IActivityTemplateFactory
  • 原文地址:https://www.cnblogs.com/rixiang/p/5254101.html
Copyright © 2011-2022 走看看