首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

struts2上的fckeditor插件

2012-11-18 
struts2下的fckeditor插件1、不需要fckEditor原文件2、支持注入UserAction3、上传文件自动改名和排序4、支持fc

struts2下的fckeditor插件
1、不需要fckEditor原文件
2、支持注入UserAction
3、上传文件自动改名和排序
4、支持fckEditor根目录不在WEB应用内
5、fckEditor的filter不需要了
6、自动对大的图片文件进行裁减
6、修改/fckeditor.properties可以适应struts.action.extension的变化

jar和war都做了更新
fckeditor.image.max.size = 1024fckeditor.image.max.width = 450fckeditor.image.max.height = 450
4、struts扩展名不是action的情况;

fckeditor.struts.extension = do

5、在jsp中:
<%@ taglib uri="http://java.fckeditor.net" prefix="FCK" %><FCK:editor instanceName="EditorDefault"/>

public class MyUserAction implements UserAction {/** * 处理上传,比如记录到数据库中 */public void doUploadFile(HttpServletRequest arg0, String arg1, File file) {System.out.println(file.getName());}/** * 自定义目录 */public String getCustomPath() {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");return formatter.format(new java.util.Date());}/** * 是否可以浏览 */public boolean isEnabledForFileBrowsing(HttpServletRequest arg0) {return true;}/** * 是否可以上传 */public boolean isEnabledForFileUpload(HttpServletRequest arg0) { // HttpSession session = request.getSession(true);// Authentication authentication = (Authentication) session// .getAttribute(LOGIN_KEY);// if(authentication==null){// return false//}return true;}}package haotian.fck.action;import haotian.fck.util.CommandHandler;import haotian.fck.util.ExtensionsHandler;import haotian.fck.util.Messages;import haotian.fck.util.ResourceTypeHandler;import haotian.fck.util.UploadResponse;import haotian.fck.util.Utils;import haotian.fck.util.XmlResponse;import java.io.File;import java.io.PrintWriter;import org.apache.commons.io.FilenameUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class FckAction extends FckBaseAction {private static final long serialVersionUID = 7015142965678474546L;private static final Log logger = LogFactory.getLog(FckAction.class);public String execute() throws Exception {if (this.isPostMethod()) {return this.doPost();} else {return this.doGet();}}public String doGet() throws Exception {logger.debug("-----浏览动作开始-----");response.setCharacterEncoding("UTF-8");response.setHeader("Cache-Control", "no-cache");response.setContentType("application/xml; charset=UTF-8");if (logger.isDebugEnabled()) {logger.debug("Parameter Command: " + commandStr);logger.debug("Parameter Type: " + typeStr);logger.debug("Parameter CurrentFolder:" + currentFolderStr);}PrintWriter out = response.getWriter();XmlResponse xr;if (!userAction.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 (!FckHelper.isValidPath(currentFolderStr))xr = new XmlResponse(XmlResponse.EN_ERROR,Messages.INVALID_CURRENT_FOLDER);else {CommandHandler command = CommandHandler.getCommand(commandStr);ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr);File typePath = FckHelper.getRealTypePath(resourceType.getPath());File customPath = new File(typePath, userAction.getCustomPath());FckHelper.checkDirAndCreate(customPath);File currentDir = new File(typePath, currentFolderStr);if (!currentDir.exists())xr = new XmlResponse(XmlResponse.EN_INVALID_FOLDER_NAME);else {xr = new XmlResponse(command, resourceType, currentFolderStr,FckHelper.constructResponseUrl(request, resourceType,currentFolderStr, true));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 = FckHelper.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);logger.debug("-----浏览动作结束-----");return null;}public String doPost() throws Exception {logger.debug("-----上传动作开始-----");response.setCharacterEncoding("UTF-8");response.setHeader("Cache-Control", "no-cache");response.setContentType("text/html; charset=UTF-8");if (logger.isDebugEnabled()) {logger.debug("Parameter Command: " + commandStr);logger.debug("Parameter Type: " + typeStr);logger.debug("Parameter CurrentFolder:" + currentFolderStr);}PrintWriter out = response.getWriter();UploadResponse ur;// if this is a QuickUpload request, 'commandStr' and 'currentFolderStr'// are emptyif (Utils.isEmpty(commandStr) && Utils.isEmpty(currentFolderStr)) {commandStr = "QuickUpload";currentFolderStr = "/" + userAction.getCustomPath() + "/";}if (currentFolderStr.equals("/")) {ur = new UploadResponse(UploadResponse.SC_ERROR, null, null,"请按月份存放上传文件,不允许上传到根目录");} else if (!userAction.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 (!FckHelper.isValidPath(currentFolderStr))ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;else {ResourceTypeHandler resourceType = ResourceTypeHandler.getDefaultResourceType(typeStr);File typePath = FckHelper.getRealTypePath(resourceType.getPath());// 得到实际地址FckHelper.checkDirAndCreate(typePath);File currentDir = new File(typePath, currentFolderStr);if (!currentDir.exists())ur = UploadResponse.UR_INVALID_CURRENT_FOLDER;else {try {String rawName = FckHelper.sanitizeFileName(uploadFileName);String filename = FilenameUtils.getName(rawName);String extension = FilenameUtils.getExtension(filename);if (!ExtensionsHandler.isAllowed(resourceType, extension))ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION);else {String newFilename = String.valueOf(System.currentTimeMillis()).concat(".").concat(extension);ur = new UploadResponse(UploadResponse.SC_OK, FckHelper.constructResponseUrl(request, resourceType,currentFolderStr, true).concat(newFilename));// secure image checkFile toFile = new File(currentDir, newFilename);if (resourceType.equals(ResourceTypeHandler.IMAGE)) {if (FckHelper.isSecureImageUploads()&& !isImageFile(upload)) {ur = new UploadResponse(UploadResponse.SC_INVALID_EXTENSION);}doImageFile(upload, toFile);} else {moveFile(upload, toFile);}userAction.doUploadFile(request, uploadFileName, toFile);}} catch (Exception e) {ur = new UploadResponse(UploadResponse.SC_SECURITY_ERROR);}}}out.print(ur);out.flush();out.close();logger.debug("-----上传动作结束-----");return null;}}
FckBaseAction :
abstract class FckBaseAction extends ActionSupport implementsServletRequestAware, ServletResponseAware {protected HttpServletRequest request;protected HttpServletResponse response;protected String commandStr;protected String typeStr;protected String currentFolderStr;protected File upload;protected String uploadContentType;protected String uploadFileName;protected UserAction userAction = new DefaultUserActionImpl();public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}public void setCommand(String commandStr) {this.commandStr = commandStr;}public void setCurrentFolder(String currentFolderStr) {this.currentFolderStr = currentFolderStr;}public void setType(String typeStr) {this.typeStr = typeStr;}public void setUserAction(UserAction userAction) {this.userAction = userAction;}protected boolean isPostMethod() {String method = request.getMethod();return "POST".equals(method);}protected boolean isLargeImage(File file) throws Exception {FileInputStream fis = null;try {fis = new FileInputStream(file.getPath());int size = fis.available() / 1024;if (size > FckHelper.getImageMaxSize()) {return true;}ImageInfo ii = new ImageInfo();ii.setInput(fis);int height = ii.getHeight();int width = ii.getWidth();if (height > FckHelper.getImageMaxHeight()|| width > FckHelper.getImageMaxWidth()) {return true;}return false;} catch (Exception e) {return false;} finally {if (fis != null)fis.close();}}protected boolean isImageFile(File file) throws Exception {FileInputStream fis = null;try {fis = new FileInputStream(file);return FckHelper.isImage(fis);} finally {if (fis != null)fis.close();}}protected void doImageFile(File upload, File toFile) throws Exception {if (isLargeImage(upload)) {createMinImage(upload, toFile, FckHelper.getImageMaxWidth(),FckHelper.getImageMaxHeight());upload.delete();} else {moveFile(upload, toFile);}System.out.println(toFile);}protected boolean createMinImage(File fromImg, File toImg, int toWidth,int toHeight) throws Exception {try {// fileExtNmae是图片的格式 gif JPG 或png// String fileExtNmae="";double wRatio = 0.0;double hRatio = 0.0;double iRatio = 0.0;BufferedImage Bi = ImageIO.read(fromImg);// 假设图片宽 高 最大为120 120hRatio = ((double) toHeight) / Bi.getHeight();wRatio = ((double) toWidth) / Bi.getWidth();iRatio = wRatio < hRatio ? wRatio : hRatio;Image Itemp = Bi.getScaledInstance((int) (toWidth * iRatio),(int) (toHeight * iRatio), BufferedImage.SCALE_SMOOTH);AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(iRatio, iRatio), null);Itemp = op.filter(Bi, null);ImageIO.write((BufferedImage) Itemp, "jpg", toImg);} catch (Exception ex) {return false;}return (true);}protected void moveFile(File upFile, File toFile) {upFile.renameTo(toFile);}public void setNewFile(File upload) {this.upload = upload;}public void setNewFileContentType(String uploadContentType) {this.uploadContentType = uploadContentType;}public void setNewFileFileName(String uploadFileName) {this.uploadFileName = uploadFileName;}
<constant name="struts.multipart.maxSize" value="20971520" />
fckeditor.image.max.size是用来判断大图片文件的
超过这个尺寸的图片文件需要做缩略图
2、缩略图的代码对jpg是支持的
引用很希望您能做个比较详细的例子(关于图片上传的)
3、例子可以参看上传的fcktest.war


8 楼 dengquangang 2009-06-23   如果我想移除fckEditor里面的某项功能,不想要上传图片,不想要上传flash等,该怎么解决呀,谢谢啦 9 楼 wanghui_chris 2009-11-13   有个问题请教,如果我想把上传目录不放到web应用下,该如何做呢?
我在fckeditor.properties中增加了下面一行:
connector.userFilesPath = c:\tmp,但查看服务器时系统告诉我是个无效目录。
希望楼主帮我解决一下这个问题。我的测试环境就是楼主提供的那个war.

热点排行