Fckeditor完美结合Struts2(2)——文件上传与重命名
Step1. 要上传文件,首先要配置 Web.xml
配置如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <filter>
- <filter-name>struts2</filter-name>
- <!-- 控制器 -->
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <!-- 任何请求均有过滤器 -->
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <servlet>
- <servlet-name>Connector</servlet-name>
- <servlet-class>
- net.fckeditor.connector.ConnectorServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Connector</servlet-name>
- <url-pattern>
- /fckeditor/editor/filemanager/connectors/*
- </url-pattern>
- </servlet-mapping>
- </web-app>
Step2. 在src目录下新建一个fckeditor.properties文件,内容如下:
- connector.userActionImpl =net.fckeditor.requestcycle.impl.UserActionImpl
好了,现在可以去页面上看看了,不过出错了:
或者是:
出现这个问题的原因是Fckeditor的拦截Servlet和Struts2的Servlet的冲突了。
解决方法是修改web.xml如下
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <filter>
- <filter-name>struts2</filter-name>
- <!-- 控制器 -->
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/struts/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>default.jsp</welcome-file>
- </welcome-file-list>
- <servlet>
- <servlet-name>Connector</servlet-name>
- <servlet-class>
- net.fckeditor.connector.ConnectorServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Connector</servlet-name>
- <url-pattern>
- /fckeditor/editor/filemanager/connectors/*
- </url-pattern>
- </servlet-mapping>
- </web-app>
使得Struts2的拦截器只拦截.jsp和.action的请求。
现在再到页面上去看看,可以上传了。
Step3. 改成随机数命名文件。
由于fckeditor的文件上传功能主要是由web.xml中配置的 net.fckeditor.connector.ConnectorServlet这个类拦截的,所以我们要自己来重命名文件的话,就要修改这个类。
办法是在net.fckeditor.connector.ConnectorServlet的基础上,建立自己的Servlet。
在项目src目录下建立以下包
cn.nileader.tool
里面建立两个类:
GetCode.java
- package com.rctraffic110.tool;
- import java.text.SimpleDateFormat;
- public class GetCode {
- /*
- * 获取一个记录编号
- * 格式:12 位时间+业务编号+随即数
- * 例如:100330101028+04+893 (2010-03-30-10:20:28, 业务号是04, 随机数893 )
- *@param btype 业务类型编号 员工业务01 招聘业务02……
- *@return code 构造的一个记录编号
- */
- public static String getNo(String btype){
- //返回的code
- String code;
- //系统当前时间 12位
- SimpleDateFormat sdf=new SimpleDateFormat("yyMMddhhmmss");
- String nowDate=sdf.format(new java.util.Date());
- //随机数
- String iRandom = Math.round(Math.random()*900 )+100 +"";
- //整合一个code
- return nowDate + btype + iRandom ;
- }
- }
上面这个类是个随机获取编号的方法。
再建立这个类
ConcectorServlet.java
- package com.rctraffic110.tool;
- import java.io.File;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.List;
- 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;
- public class ConnectorServlet extends HttpServlet {
- private static final long serialVersionUID = -5742008970929377161L;
- private static final Logger logger = LoggerFactory.getLogger(ConnectorServlet.class);
- 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!");
- }
- 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(request
- .getParameter("NewFolderName"));
- 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");
- }
- @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 = GetCode.getNo("1104" )+"."+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 p_w_picpath 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");
- }
- }
目录结构为:
再修改web.xml中的Servlet如下:
- <servlet>
- <servlet-name>Connector</servlet-name>
- <servlet-class>
- cn.nileader.tool.ConnectorServlet
- </servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
效果如下:
本文出自 “ni掌柜在路上” 博客,请务必保留此出处http://nileader.blog.51cto.com/1381108/303234
转载于:https://blog.51cto.com/jetshi0125/318596