/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.portal.action; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import com.jinhe.tss.component.support.web.webwork.PTActionSupport; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.util.EasyUtils; import com.jinhe.tss.core.util.FileHelper; import com.jinhe.tss.core.util.URLUtil; import com.jinhe.tss.portal.PortalConstants; /** * 管理门户、页面、布局器、修饰器、布局器等的附件资源。 */ public class FileAction extends PTActionSupport { private static final long serialVersionUID = -7584264169655878781L; public static final String[] ELEMENT_TYPE = new String[]{"layout", "decorator", "portlet"}; /** * 参数列表 paramsMap['" + param + "']" */ private Map<String, Object> paramsMap = new HashMap<String, Object>(); // private File file; private String fileName; //文件名 private String newFileName; //文件名 private String fileNames; private String folderNames; private String filter = ""; //文件后缀名 private String contextPath; //当前操作文件所在目录上下文 /** * 列出文件列表 * @return */ public String listAvailableFiles(){ String id = getParamFromMap("id"); String code = getParamFromMap("code"); String type = getParamFromMap("type"); // 判断是何种类型的资源管理 if(type == null) { throw new BusinessException("没有指定文件类型"); } StringBuffer sb = new StringBuffer("<actionSet title=\"\" openednodeid=\"r1.1\">"); // 如果contextPath不为空,则直接使用contextPath值作为根目录;否则根据type值找根目录 File baseDir = null; String portalModelDir = URLUtil.getWebFileUrl(PortalConstants.PORTAL_MODEL_DIR).getPath(); File portalRootDir = new File(portalModelDir + "/" + code + "_" + id); // 指定门户的资源根目录 if( contextPath != null ){ if( (baseDir = new File(contextPath)).equals(portalRootDir) ) { // 不用目录上翻的按钮,以免翻到目录外面去。 } else { // .. 为目录上翻的按钮 sb.append("<treeNode id=\"-1\" name=\"..\" icon=\"../platform/images/icon/folder.gif\" />"); } } else { if( "site".equalsIgnoreCase(type) ) { // 门户结构 baseDir = portalRootDir; } else if(Arrays.asList(ELEMENT_TYPE).contains(type)) { // 门户元素 String elementPath = URLUtil.getWebFileUrl(PortalConstants.MODEL_DIR + type).getPath(); baseDir = new File(elementPath + "/" + code + id); } } if(baseDir == null) { throw new BusinessException("路径为空"); } List<String> files= sortFile(baseDir, FileHelper.listFilesByType(filter, baseDir)); int i = 0; for( String fileName : files ){ sb.append("<treeNode id=\"").append(i++).append("\" name=\"").append(fileName); boolean isFolder = FileHelper.isFolder(baseDir, fileName); if(isFolder) { sb.append("\" isFolder=\"").append("1"); } sb.append("\" icon=\"../platform/images/icon/" + (isFolder ? "folder.gif" : "file.gif") + "\"/>"); } sb.append("</actionSet>"); String path = file.getPath(); String contextPath = path.substring(path.lastIndexOf("model") + 6); return print(new String[]{"ContextPath", "ResourceTree"}, new Object[]{contextPath, sb}); } private String getParamFromMap(String paramName){ Object[] objs = (Object[]) paramsMap.get(paramName); if(objs != null && objs.length > 0){ return (String) objs[0]; } return null; } /* 将子文件夹、文件进行归类,文件夹在前 */ private List<String> sortFile(File baseDir, List<String> files){ List<String> dirs = new ArrayList<String>(); for(Iterator<String> it = files.iterator(); it.hasNext();){ String fileName = (String) it.next(); if(FileHelper.isFolder(baseDir, fileName)){ dirs.add(fileName); it.remove(); } } dirs.addAll(files); return dirs; } /** * 上传文件 * @return */ public String upload(){ File baseDir = null; if(contextPath != null){ baseDir = new File(contextPath); } if(baseDir != null && file != null) { FileHelper.copyFile(baseDir, file); } return print("script", "window.parent.loadFileTree();"); } /** * 下载 * @return */ public String download(){ if(fileNames == null) return XML; // 建立临时文件夹存放要下载的所有文件 File tempDir = new File(contextPath + "temp"); if ( !tempDir.exists() ) { tempDir.mkdir(); } String[] fNames = fileNames.split(","); for ( String fileName : fNames ) { File file = new File(contextPath + fileName); if (file.exists()) { FileHelper.copyFile(tempDir, file, true, false); // 拷贝文件至临时文件夹 } } String zipFilePath = FileHelper.exportZip(contextPath, tempDir); // 将临时文件夹里的文件打包成zip文件 FileHelper.deleteFile(tempDir); // 删除临时文件夹 FileHelper.downloadFileByHttp(zipFilePath, "download.zip"); // 下载zip包 return XML; } /** * 删除文件(文件夹) * @return */ public String deleteFile(){ List<String> pathList = new ArrayList<String>(); if(fileNames != null) { pathList.addAll(Arrays.asList(fileNames.split(","))); } if(folderNames != null) { pathList.addAll(Arrays.asList(folderNames.split(","))); } for(String fileOrDir : pathList){ if( EasyUtils.isNullOrEmpty(fileOrDir)) continue; try { FileHelper.deleteFile(new File(contextPath + fileOrDir)); } catch (Exception e) { throw new BusinessException(fileOrDir + "文件删除失败,可能文件正在使用中!", e); } } return print("script", "window.parent.loadFileTree();"); } /** * 重命名文件(文件夹) * @return */ public String renameFile(){ File newFile = new File(contextPath + newFileName); if(newFile.exists()) { throw new BusinessException("同名文件(夹)已经存在,重命名失败!"); } File file = new File(contextPath + fileName); if( file.renameTo(newFile) ) { return print("script", "window.parent.loadFileTree();"); } throw new BusinessException("重命名失败,可能文件正在使用中!"); } /** * 新建文件夹 * @return */ public String addDir(){ FileHelper.createDir(contextPath + newFileName); return print("script", "window.parent.loadFileTree();"); } public Map<String, Object> getParamsMap() { return paramsMap; } public void setContextPath(String contextPath) { if(contextPath != null) { String modelDir = URLUtil.getWebFileUrl(PortalConstants.MODEL_DIR).getPath(); this.contextPath = modelDir + "/" + contextPath + "/"; } } public void setFile(File file) { this.file = file; } public void setFilter(String filter) { if(filter == null || filter.length() == 0 || "*.*".equals(filter)){ this.filter = ""; } else if(filter.startsWith("*")){ this.filter = filter.substring(1); } else { this.filter = filter; } } public void setFileName(String fileName) { this.fileName = fileName; } public void setNewFileName(String newFileName) { this.newFileName = newFileName; } public void setFileNames(String fileNames) { this.fileNames = fileNames; } public void setFolderNames(String folderNames) { this.folderNames = folderNames; } }