ConnectorServlet.java
上传用户:wlfwy2004
上传日期:2016-12-12
资源大小:33978k
文件大小:10k
源码类别:

Jsp/Servlet

开发平台:

Java

  1. /*
  2.  * FCKeditor - The text editor for internet
  3.  * Copyright (C) 2003-2005 Frederico Caldeira Knabben
  4.  *
  5.  * Licensed under the terms of the GNU Lesser General Public License:
  6.  *  http://www.opensource.org/licenses/lgpl-license.php
  7.  *
  8.  * For further information visit:
  9.  *  http://www.fckeditor.net/
  10.  *
  11.  * File Name: ConnectorServlet.java
  12.  *  Java Connector for Resource Manager class.
  13.  *
  14.  * Version:  2.1
  15.  * Modified: 2005-03-29 21:30:00
  16.  *
  17.  * File Authors:
  18.  *  Simone Chiaretta (simo@users.sourceforge.net)
  19.  */
  20. package com.fredck.FCKeditor.connector;
  21. import java.io.*;
  22. import javax.servlet.*;
  23. import javax.servlet.http.*;
  24. import java.util.*;
  25. import org.apache.commons.fileupload.*;
  26. import javax.xml.parsers.*;
  27. import org.w3c.dom.*;
  28. import javax.xml.transform.*;
  29. import javax.xml.transform.dom.DOMSource;
  30. import javax.xml.transform.stream.StreamResult;
  31. import com.opensource.blog.comm.*;
  32. import com.opensource.blog.web.servlet.UserSession;
  33. /**
  34.  * Servlet to upload and browse files.<br>
  35.  *
  36.  * This servlet accepts 4 commands used to retrieve and create files and folders from a server directory.
  37.  * The allowed commands are:
  38.  * <ul>
  39.  * <li>GetFolders: Retrive the list of directory under the current folder
  40.  * <li>GetFoldersAndFiles: Retrive the list of files and directory under the current folder
  41.  * <li>CreateFolder: Create a new directory under the current folder
  42.  * <li>FileUpload: Send a new file to the server (must be sent with a POST)
  43.  * </ul>
  44.  *
  45.  * @author Simone Chiaretta (simo@users.sourceforge.net)
  46.  */
  47. public class ConnectorServlet
  48.     extends HttpServlet {
  49.   private static String baseDir;
  50.   private static boolean debug = false;
  51.   /**
  52.    * Initialize the servlet.<br>
  53.    * Retrieve from the servlet configuration the "baseDir" which is the root of the file repository:<br>
  54.    * If not specified the value of "/UserFiles/" will be used.
  55.    *
  56.    */
  57.   public void init() throws ServletException {
  58.     baseDir = getInitParameter("baseDir");
  59.     debug = (new Boolean(getInitParameter("debug"))).booleanValue();
  60.     if (baseDir == null) {
  61.       baseDir = "/UserFiles/";
  62.     }
  63.     String realBaseDir = getServletContext().getRealPath(baseDir);
  64.     File baseFile = new File(realBaseDir);
  65.     if (!baseFile.exists()) {
  66.       baseFile.mkdir();
  67.     }
  68.   }
  69.   /**
  70.    * Manage the Get requests (GetFolders, GetFoldersAndFiles, CreateFolder).<br>
  71.    *
  72.    * The servlet accepts commands sent in the following format:<br>
  73.    * connector?Command=CommandName&Type=ResourceType&CurrentFolder=FolderPath<br><br>
  74.    * It execute the command and then return the results to the client in XML format.
  75.    *
  76.    */
  77.   public void doGet(HttpServletRequest request, HttpServletResponse response) throws
  78.       ServletException, IOException {
  79.       if (debug) {
  80.     System.out.println("--- BEGIN DOGET ---");
  81.   }
  82.   response.setContentType("text/xml; charset=UTF-8");
  83.       response.setHeader("Cache-Control", "no-cache");
  84.       PrintWriter out = response.getWriter();
  85.       String commandStr = request.getParameter("Command");
  86.       String typeStr = request.getParameter("Type");
  87.       String currentFolderStr = request.getParameter("CurrentFolder");
  88.       String currentPath = baseDir + typeStr + currentFolderStr;
  89.       String currentDirPath = getServletContext().getRealPath(currentPath);
  90.       File currentDir = new File(currentDirPath);
  91.       if (!currentDir.exists()) {
  92.     currentDir.mkdir();
  93.   }
  94.   Document document = null;
  95.       try {
  96.     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  97.     DocumentBuilder builder = factory.newDocumentBuilder();
  98.     document = builder.newDocument();
  99.   }
  100.   catch (ParserConfigurationException pce) {
  101.     pce.printStackTrace();
  102.   }
  103.   Node root = CreateCommonXml(document, commandStr, typeStr, currentFolderStr,
  104.                               request.getContextPath() + currentPath);
  105.       if (debug) {
  106.     System.out.println("Command = " + commandStr);
  107.   }
  108.   if (commandStr.equals("GetFolders")) {
  109.     getFolders(currentDir, root, document);
  110.   }
  111.   else if (commandStr.equals("GetFoldersAndFiles")) {
  112.     getFolders(currentDir, root, document);
  113.     getFiles(currentDir, root, document);
  114.   }
  115.   else if (commandStr.equals("CreateFolder")) {
  116.     String newFolderStr = request.getParameter("NewFolderName");
  117.     File newFolder = new File(currentDir, newFolderStr);
  118.     String retValue = "110";
  119.     if (newFolder.exists()) {
  120.       retValue = "101";
  121.     }
  122.     else {
  123.       try {
  124.         boolean dirCreated = newFolder.mkdir();
  125.         if (dirCreated) {
  126.           retValue = "0";
  127.         }
  128.         else {
  129.           retValue = "102";
  130.         }
  131.       }
  132.       catch (SecurityException sex) {
  133.         retValue = "103";
  134.       }
  135.     }
  136.     setCreateFolderResponse(retValue, root, document);
  137.   }
  138.   document.getDocumentElement().normalize();
  139.       try {
  140.     TransformerFactory tFactory = TransformerFactory.newInstance();
  141.     Transformer transformer = tFactory.newTransformer();
  142.     DOMSource source = new DOMSource(document);
  143.     StreamResult result = new StreamResult(out);
  144.     transformer.transform(source, result);
  145.     if (debug) {
  146.       StreamResult dbgResult = new StreamResult(System.out);
  147.       transformer.transform(source, dbgResult);
  148.       System.out.println("");
  149.       System.out.println("--- END DOGET ---");
  150.     }
  151.   }
  152.   catch (Exception ex) {
  153.     ex.printStackTrace();
  154.   }
  155.   out.flush();
  156.       out.close();
  157.   }
  158.       /**
  159.        * Manage the Post requests (FileUpload).<br>
  160.        *
  161.        * The servlet accepts commands sent in the following format:<br>
  162.        * connector?Command=FileUpload&Type=ResourceType&CurrentFolder=FolderPath<br><br>
  163.        * It store the file (renaming it in case a file with the same name exists) and then return an HTML file
  164.        * with a javascript command in it.
  165.        *
  166.        */
  167.       public void doPost(HttpServletRequest request, HttpServletResponse response) throws
  168.       ServletException, IOException {
  169.       if (debug) {
  170.     System.out.println("--- BEGIN DOPOST ---");
  171.   }
  172.   response.setContentType("text/html; charset=UTF-8");
  173.       response.setHeader("Cache-Control", "no-cache");
  174.       PrintWriter out = response.getWriter();
  175.       String commandStr = request.getParameter("Command");
  176.       String typeStr = request.getParameter("Type");
  177.       String currentFolderStr = request.getParameter("CurrentFolder");
  178.       String currentPath = baseDir + typeStr + currentFolderStr;
  179.       String currentDirPath = getServletContext().getRealPath(currentPath);
  180.       System.out.println(currentDirPath);
  181.       String retVal = "0";
  182.       String newName = "";
  183.       if (!commandStr.equals("FileUpload")) {
  184.     retVal = "203";
  185.   }
  186.   else {
  187.     DiskFileUpload upload = new DiskFileUpload();
  188.     try {
  189.       List items = upload.parseRequest(request);
  190.       Map fields = new HashMap();
  191.       Iterator iter = items.iterator();
  192.       while (iter.hasNext()) {
  193.         FileItem item = (FileItem) iter.next();
  194.         if (item.isFormField()) {
  195.           fields.put(item.getFieldName(), item.getString());
  196.         }
  197.         else {
  198.           fields.put(item.getFieldName(), item);
  199.         }
  200.       }
  201.       FileItem uplFile = (FileItem) fields.get("NewFile");
  202.       String fileNameLong = uplFile.getName();
  203.       fileNameLong = fileNameLong.replace('\', '/');
  204.       String[] pathParts = fileNameLong.split("/");
  205.       String fileName = pathParts[pathParts.length - 1];
  206.       String nameWithoutExt = getNameWithoutExtension(fileName);
  207.       String ext = getExtension(fileName);
  208.       File pathToSave = new File(currentDirPath, fileName);
  209.       int counter = 1;
  210.       while (pathToSave.exists()) {
  211.         newName = nameWithoutExt + "(" + counter + ")" + "." + ext;
  212.         retVal = "201";
  213.         pathToSave = new File(currentDirPath, newName);
  214.         counter++;
  215.       }
  216.       uplFile.write(pathToSave);
  217.     }
  218.     catch (Exception ex) {
  219.       retVal = "203";
  220.     }
  221.   }
  222.   out.println("<script type="text/javascript">");
  223.       out.println("window.parent.frames['frmUpload'].OnUploadCompleted(" + retVal + ",'" + newName +
  224.                   "');");
  225.       out.println("</script>");
  226.       out.flush();
  227.       out.close();
  228.       if (debug) {
  229.     System.out.println("--- END DOPOST ---");
  230.   }
  231.   }
  232.       private void setCreateFolderResponse(String retValue, Node root, Document doc) {
  233.     Element myEl = doc.createElement("Error");
  234.     myEl.setAttribute("number", retValue);
  235.     root.appendChild(myEl);
  236.   }
  237.   private void getFolders(File dir, Node root, Document doc) {
  238.     Element folders = doc.createElement("Folders");
  239.     root.appendChild(folders);
  240.     File[] fileList = dir.listFiles();
  241.     for (int i = 0; i < fileList.length; ++i) {
  242.       if (fileList[i].isDirectory()) {
  243.         Element myEl = doc.createElement("Folder");
  244.         myEl.setAttribute("name", fileList[i].getName());
  245.         folders.appendChild(myEl);
  246.       }
  247.     }
  248.   }
  249.   private void getFiles(File dir, Node root, Document doc) {
  250.     Element files = doc.createElement("Files");
  251.     root.appendChild(files);
  252.     File[] fileList = dir.listFiles();
  253.     for (int i = 0; i < fileList.length; ++i) {
  254.       if (fileList[i].isFile()) {
  255.         Element myEl = doc.createElement("File");
  256.         myEl.setAttribute("name", fileList[i].getName());
  257.         myEl.setAttribute("size", "" + fileList[i].length() / 1024);
  258.         files.appendChild(myEl);
  259.       }
  260.     }
  261.   }
  262.   private Node CreateCommonXml(Document doc, String commandStr, String typeStr, String currentPath,
  263.                                String currentUrl) {
  264.     Element root = doc.createElement("Connector");
  265.     doc.appendChild(root);
  266.     root.setAttribute("command", commandStr);
  267.     root.setAttribute("resourceType", typeStr);
  268.     Element myEl = doc.createElement("CurrentFolder");
  269.     myEl.setAttribute("path", currentPath);
  270.     myEl.setAttribute("url", currentUrl);
  271.     root.appendChild(myEl);
  272.     return root;
  273.   }
  274.   /*
  275.    * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489
  276.    */
  277.   private static String getNameWithoutExtension(String fileName) {
  278.     return fileName.substring(0, fileName.lastIndexOf("."));
  279.   }
  280.   /*
  281.    * This method was fixed after Kris Barnhoorn (kurioskronic) submitted SF bug #991489
  282.    */
  283.   private String getExtension(String fileName) {
  284.     return fileName.substring(fileName.lastIndexOf(".") + 1);
  285.   }
  286. }