Index: forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java =================================================================== diff -u -r15543 -r15795 --- forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java (.../KnowledgeFileManagerImpl.java) (revision 15543) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManagerImpl.java (.../KnowledgeFileManagerImpl.java) (revision 15795) @@ -1,9 +1,22 @@ package com.forgon.knowledge.service; +import java.io.File; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Map; +import com.beust.jcommander.ParameterException; +import com.forgon.attachfile.enums.AttachFileSaveType; +import com.forgon.attachfile.model.AttachFileInterface; +import com.forgon.attachfile.service.AttachFileManager; +import com.forgon.knowledge.controller.KnowledgeFileController; +import com.forgon.knowledge.model.KnowledgeFolder; +import com.forgon.tools.Constants; +import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang.StringUtils; import com.forgon.knowledge.model.KnowledgeFile; @@ -15,132 +28,253 @@ import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.treenode.service.THTreeNodeManager; +import org.apache.log4j.Logger; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import javax.servlet.http.HttpServletRequest; + /** * @author yuanbin - * */ public class KnowledgeFileManagerImpl implements KnowledgeFileManager { - private ObjectDao objectDao; - private THTreeNodeManager thTreeNodeManager; - private KnowledgeModuleManager knowledgeModuleManager; - private AclManager aclManager; - public void setAclManager(AclManager aclManager) { - this.aclManager = aclManager; - } - - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } - - public void setThTreeNodeManager(THTreeNodeManager thTreeNodeManager) { - this.thTreeNodeManager = thTreeNodeManager; - } - - public void setKnowledgeModuleManager( - KnowledgeModuleManager knowledgeModuleManager) { - this.knowledgeModuleManager = knowledgeModuleManager; - } + protected Logger logger = Logger.getLogger(this.getClass()); + private ObjectDao objectDao; + private THTreeNodeManager thTreeNodeManager; + private KnowledgeModuleManager knowledgeModuleManager; + private AclManager aclManager; - - public void delete(KnowledgeFile po) { - objectDao.delete(po); - } + private AttachFileManager attachFileManager; - - public void deleteFileNodeByIds(String moduleId, List ids) { - for(Long id : ids){ - KnowledgeFile fileNode = getById(moduleId, id.toString()); - objectDao.delete(fileNode); - } - } + public void setAttachFileManager(AttachFileManager attachFileManager) { + this.attachFileManager = attachFileManager; + } - - public KnowledgeFile getById(String moduleId, String id) { - ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); - KnowledgeFile knowledgeFile = (KnowledgeFile)objectDao.getByProperty(moduleXmlBean.getFileClassName(), "id", Long.valueOf(id)); + public void setAclManager(AclManager aclManager) { + this.aclManager = aclManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setThTreeNodeManager(THTreeNodeManager thTreeNodeManager) { + this.thTreeNodeManager = thTreeNodeManager; + } + + public void setKnowledgeModuleManager( + KnowledgeModuleManager knowledgeModuleManager) { + this.knowledgeModuleManager = knowledgeModuleManager; + } + + @Override + public void delete(KnowledgeFile po) { + objectDao.delete(po); + } + + @Override + public void deleteFileNodeByIds(String moduleId, List ids) { + for (Long id : ids) { + KnowledgeFile fileNode = getById(moduleId, id.toString()); + objectDao.delete(fileNode); + } + } + + @Override + public KnowledgeFile getById(String moduleId, String id) { + ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); + KnowledgeFile knowledgeFile = (KnowledgeFile) objectDao.getByProperty(moduleXmlBean.getFileClassName(), "id", Long.valueOf(id)); // aclManager.setAclFieldsObjectDisplayValue(knowledgeFile); - return knowledgeFile; - } + return knowledgeFile; + } - @SuppressWarnings("unchecked") - - public List findKnowledgeFileByFolderId(String moduleId, String id) { - ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); - - List allChildrenId = thTreeNodeManager.getAllChildrenIdByTHTreeNodeId( - moduleXmlBean.getFolderClassName(), Long.valueOf(id)); - List fileNodes = (List)objectDao.findBySql(moduleXmlBean.getFileClassName(), "where folder in ("+StringUtils.join(allChildrenId.iterator(), ",")+")"); - return fileNodes; - } + @Override + public List findKnowledgeFileByFolderId(String moduleId, String id) { + ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); - @SuppressWarnings("unchecked") - - public void sortFile(String moduleId, String id, String orderType) { - - KnowledgeFile fileNode = getById(moduleId, id); - if (fileNode == null) { - return; - } + List allChildrenId = thTreeNodeManager.getAllChildrenIdByTHTreeNodeId( + moduleXmlBean.getFolderClassName(), Long.valueOf(id)); + List fileNodes = (List) objectDao.findBySql(moduleXmlBean.getFileClassName(), "where folder in (" + StringUtils.join(allChildrenId.iterator(), ",") + ")"); + return fileNodes; + } - if (!(orderType.equalsIgnoreCase("up") || orderType - .equalsIgnoreCase("down"))) { - return; - } + @Override + public void sortFile(String moduleId, String id, String orderType) { - String sql = "Where (po.folder=" + fileNode.getFolder().getId()+ ") "; - String orderField = "sequenceNumber DESC"; - if (orderType.equalsIgnoreCase("up")) - sql += "and (po.sequenceNumber<" + fileNode.getSequenceNumber() + ")"; - else { - sql += "and (po.sequenceNumber>" + fileNode.getSequenceNumber() + ")"; - orderField = "sequenceNumber asc"; - } - List list = objectDao.findBySql(knowledgeModuleManager.getFileClassSimpleNameByModuleId(moduleId), sql, 0, 1, orderField); + KnowledgeFile fileNode = getById(moduleId, id); + if (fileNode == null) { + return; + } - if (list == null || list.size() == 0) { - return; - } + if (!(orderType.equalsIgnoreCase("up") || orderType + .equalsIgnoreCase("down"))) { + return; + } - KnowledgeFile changefileNode = (KnowledgeFile) list.get(0); - long tempSequenceNumber = fileNode.getSequenceNumber(); - fileNode.setSequenceNumber(changefileNode.getSequenceNumber()); - changefileNode.setSequenceNumber(tempSequenceNumber); - - AclTools.addStartAndEndToken(changefileNode); - AclTools.addStartAndEndToken(fileNode); - - objectDao.saveOrUpdate(changefileNode); - objectDao.saveOrUpdate(fileNode); - } + String sql = "Where (po.folder=" + fileNode.getFolder().getId() + ") "; + String orderField = "sequenceNumber DESC"; + if (orderType.equalsIgnoreCase("up")) { + sql += "and (po.sequenceNumber<" + fileNode.getSequenceNumber() + ")"; + } + else { + sql += "and (po.sequenceNumber>" + fileNode.getSequenceNumber() + ")"; + orderField = "sequenceNumber asc"; + } + List list = objectDao.findBySql(knowledgeModuleManager.getFileClassSimpleNameByModuleId(moduleId), sql, 0, 1, orderField); - - public void submit(KnowledgeFile po) { - if(po.getId() == null ){ - po.setSequenceNumber(getMaxUserOrder(po.getClass().getSimpleName(), po.getFolder().getId())); - } - AclTools.addStartAndEndToken(po); - - String name = po.getClass().getSimpleName(); - - objectDao.saveOrUpdate(po); - } - - @SuppressWarnings("unchecked") - private long getMaxUserOrder(String fileSubClassName, Long folderId){ - long maxOrder = 0; - String sql = "SELECT MAX(po.sequenceNumber) AS maxOrder FROM "+fileSubClassName+" po WHERE (po.folderKeyId = " + folderId + ")"; - ResultSet rs = objectDao.executeSql(sql); - try { - while(rs.next()){ - maxOrder = rs.getInt(1); - } - } catch (SQLException e) { - e.printStackTrace(); - }finally { - DatabaseUtil.closeResultSetAndStatement(rs); - } - return maxOrder+1; - } + if (list == null || list.size() == 0) { + return; + } + + KnowledgeFile changefileNode = (KnowledgeFile) list.get(0); + long tempSequenceNumber = fileNode.getSequenceNumber(); + fileNode.setSequenceNumber(changefileNode.getSequenceNumber()); + changefileNode.setSequenceNumber(tempSequenceNumber); + + AclTools.addStartAndEndToken(changefileNode); + AclTools.addStartAndEndToken(fileNode); + + objectDao.saveOrUpdate(changefileNode); + objectDao.saveOrUpdate(fileNode); + } + + @Override + @Transactional(propagation = Propagation.REQUIRED) + public void handleUpLoadFile(KnowledgeFile knowledgeFile, String moduleId, HttpServletRequest request) { + Map map = new HashedMap(); + try { + KnowledgeFile subObject = this.setAttachFileContent(knowledgeFile, moduleId, request); + Long id = knowledgeFile.getId(); + ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); + if (moduleXmlBean == null) { + throw new ParameterException(moduleId + "模块不能为空!"); + } + if (AttachFileSaveType.LOCAL.name().equalsIgnoreCase(moduleXmlBean.getSaveMethod())) { + map.put("saveType", AttachFileSaveType.LOCAL); + map.put("filePath", moduleXmlBean.getSaveUrl()); + } + else { + map.put("saveType", AttachFileSaveType.DATABASE); + } + attachFileManager.handleSaveAttachFiles(request, subObject, map); + this.handleOriginalAttachFiles(id, moduleId, subObject); + this.submit(subObject); + } + catch (Exception e) { + logger.error(e, e); + //上传文件出错,调用出错时的方法 + this.handleUploadError(map); + throw new RuntimeException(e); + } + } + + + @Override + public void submit(KnowledgeFile po) { + if (po.getId() == null) { + po.setSequenceNumber(getMaxUserOrder(po.getClass().getSimpleName(), po.getFolder().getId())); + } + AclTools.addStartAndEndToken(po); + objectDao.merge(po); + } + + /** + * 处理原来的KnowledgeFile的attachFiles,新增保存时如果存在则用逗号来进行合并 + * + * @param id KnowledgeFile的主键id + * @param moduleId 该模块的id + * @param subObject {@link KnowledgeFile} + */ + private void handleOriginalAttachFiles(Long id, String moduleId, KnowledgeFile subObject) { + String attachFiles = null; + if (id != null) { + //查询原来是否已经有附件 + KnowledgeFile knowledgeFile = this.getById(moduleId, id.toString()); + attachFiles = knowledgeFile.getAttachFiles(); + } + if (StringUtils.isNotBlank(attachFiles)) { + //如果原来的文件已经有附件,则和新增的附件拼接在一起(如果是删除了附件再提交subObject.getAttachFiles()是空的) + if (subObject.getAttachFiles() != null) { + attachFiles += Constants.IDS_SEPARATOR_COMMA + subObject.getAttachFiles(); + } + subObject.setAttachFiles(attachFiles); + } + } + + /** + * 上传附近出错时,如果是保存到本地的文件,则删除对应的文件 + * + * @param map 里面封装了文件保存的类型和文件保存的路径 + */ + private void handleUploadError(Map map) { + //获取文件保存的方法 + AttachFileSaveType saveType = (AttachFileSaveType) map.get("saveType"); + Object fileSavePaths = map.get("fileSavePaths"); + if (fileSavePaths != null && AttachFileSaveType.LOCAL.equals(saveType)) { + //获得所有保存到本地文件的路径 + List needToDelFiles = (List) fileSavePaths; + logger.warn("上传附件出错,开始删除上传了的附件.........."); + for (String needToDelFile : needToDelFiles) { + logger.warn("附件的路径是:" + needToDelFile); + org.apache.commons.io.FileUtils.deleteQuietly(new File(needToDelFile)); + } + logger.warn("删除上传的附件成功!"); + } + } + + /** + * 设置上传文件的内容 + * + * @param knowledgeFile {@link KnowledgeFile} + * @param moduleId + * @param request + * @return + */ + private KnowledgeFile setAttachFileContent(KnowledgeFile knowledgeFile, String moduleId, HttpServletRequest request) { + try { + ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); + // 获取文件类的类名 + String fileClassName = moduleXmlBean.getFileClassName(); + // 获取文件夹类的类名 + String folderClassName = moduleXmlBean.getFolderClassName(); + // 创建文件类对应的子类,这样能保证Hibernate能根据子类的类型,正确保存到对应的数据库表中 + KnowledgeFile subObject = (KnowledgeFile) Class.forName(fileClassName).newInstance(); + // subObject.setFolder((KnowledgeFolder)Class.forName(folderClassName).newInstance()); + BeanUtils.copyProperties(subObject, knowledgeFile); + // 获取所在的文件夹对象 + String folderKeyId = request.getParameter("folderKeyId"); + Long folderId = Long.valueOf(0); + if (StringUtils.isNotEmpty(folderKeyId)) { + folderId = Long.parseLong(folderKeyId); + } + KnowledgeFolder folder = (KnowledgeFolder) thTreeNodeManager.getTHTreeNodeById(folderClassName, folderId); + subObject.setFolder(folder); + return subObject; + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + } + + + @SuppressWarnings("unchecked") + private long getMaxUserOrder(String fileSubClassName, Long folderId) { + long maxOrder = 0; + String sql = "SELECT MAX(po.sequenceNumber) AS maxOrder FROM " + fileSubClassName + " po WHERE (po.folderKeyId = " + folderId + ")"; + ResultSet rs = objectDao.executeSql(sql); + try { + while (rs.next()) { + maxOrder = rs.getInt(1); + } + } + catch (SQLException e) { + e.printStackTrace(); + } + finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return maxOrder + 1; + } } Index: forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileType.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileType.java (revision 0) +++ forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileType.java (revision 15795) @@ -0,0 +1,37 @@ +package com.forgon.attachfile.enums; + +/** + * Created by zhonghaowen on 2016/11/15. + * 附件类型枚举 + */ +public enum AttachFileType { + + VIDEO(1, "视频文件"), + OFFICE(2, "office文件"), + OTHER(3, "其他文件"); + private String desc; + private Integer val; + + AttachFileType(Integer val, String desc) { + this.val = val; + this.desc = desc; + } + + public String getDesc() { + return desc; + } + + public Integer getVal() { + return val; + } + + public static AttachFileType parseOfDesc(String desc) { + AttachFileType[] values = AttachFileType.values(); + for (AttachFileType value : values) { + if (value.getDesc().equals(desc)) { + return value; + } + } + throw new IllegalArgumentException("找不到对应的类型"); + } +} Index: ssts-web/src/main/webapp/knowledge/viewExt.jsp =================================================================== diff -u -r15543 -r15795 --- ssts-web/src/main/webapp/knowledge/viewExt.jsp (.../viewExt.jsp) (revision 15543) +++ ssts-web/src/main/webapp/knowledge/viewExt.jsp (.../viewExt.jsp) (revision 15795) @@ -1,37 +1,37 @@ <%@ page language="java" contentType="text/html; charset=UTF-8" %> <%@ include file="/common/taglibs.jsp"%> - - - + + + <%@ include file="/common/includeExtJsAndCss.jsp"%> - - - + + +
- - +<%--这个要放在下面加载,不然moduleId那几个变量有可能会出现空--%> + + \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java =================================================================== diff -u -r13416 -r15795 --- forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java (.../AttachFileManager.java) (revision 13416) +++ forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManager.java (.../AttachFileManager.java) (revision 15795) @@ -1,50 +1,80 @@ -/** - * - */ package com.forgon.attachfile.service; import java.io.File; import java.io.InputStream; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; +import com.forgon.attachfile.enums.AttachFileType; import com.forgon.attachfile.model.AttachFile; +import com.forgon.attachfile.model.AttachFileInterface; import com.forgon.attachfile.vo.AttachFileVO; /** * @author yuanbin - * */ public interface AttachFileManager { - public void deleteAttachFile(String formObjectName, String formId, - String attachFileId); + void deleteAttachFile(String formObjectName, String formId, String attachFileId); - public void deleteAllAttachFile(String attachFileIds); + void deleteAllAttachFile(String attachFileIds); - public List getAttachFilesIdAndFileName( - String formObjectName, String formId); + List getAttachFilesIdAndFileName(String formObjectName, String formId); - public void saveAttachFiles(HttpServletRequest request, Object object); + void saveAttachFiles(HttpServletRequest request, Object object); - public String[] saveAttachFilesToFileSystem(HttpServletRequest request, - String folder); + /** + * 批量将附件保存到文件系统(Spring) + * + * @param request 页面的request + * @param folder 文件夹的位置 + */ + String[] batchSaveAttachFilesToFileSystem(HttpServletRequest request, String folder); - public String[] saveAttachFilesToFileSystem(File[] files, - String[] fileNames, String folder); + /** + * 批量将附件保存到文件系统(Struts2) + * + * @param files 文件类数组 + * @param fileNames 文件名称数组 + * @param folder 文件夹的位置 + */ + String[] batchSaveAttachFilesToFileSystem(File[] files, String[] fileNames, String folder); - public List getAttachFilesIdAndFileNameByAttachIds( - String attachFileIds); + List getAttachFilesIdAndFileNameByAttachIds(String attachFileIds); - public List getInputStreamFromAttachFile( - HttpServletRequest request); - - public boolean isInputStreamContainZipFile( - HttpServletRequest request); + List getInputStreamFromAttachFile(HttpServletRequest request); - public AttachFile getById(String id); + boolean isInputStreamContainZipFile(HttpServletRequest request); - public void decreaseReferenceCountByIds(String ids, int number); + AttachFile getById(String id); - public void creaseReferenceCountByIds(String ids, int number); + void decreaseReferenceCountByIds(String ids, int number); + + void creaseReferenceCountByIds(String ids, int number); + + /** + * 处理要上传的文件(spring) + * + * @param request {@link HttpServletRequest} + * @param object {@link AttachFileInterface} + * @param map 用来传递需要的参数(目前有saveType和filePath) + */ + void handleSaveAttachFiles(HttpServletRequest request, Object object, Map map); + + /** + * 根据传过来的type判断附件的类型 + * @param type 需要判断的类型 + * @return 暂时分成video,office,other三类,后期可以自己根据业务来扩展类型 + */ + AttachFileType judgeAttachType(String type); + + /** + * 根据id来获得对应的附件类型 + * @param id 文件的主键 + * @return + */ + AttachFileType getAttachTypeById(String id); + + } Index: forgon-knowledge/src/main/java/com/forgon/knowledge/xmlbean/ModuleXmlBean.java =================================================================== diff -u -r15543 -r15795 --- forgon-knowledge/src/main/java/com/forgon/knowledge/xmlbean/ModuleXmlBean.java (.../ModuleXmlBean.java) (revision 15543) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/xmlbean/ModuleXmlBean.java (.../ModuleXmlBean.java) (revision 15795) @@ -3,91 +3,129 @@ /** * @author yuanbin - * */ public class ModuleXmlBean { - private String id; - private String name; - private String folderClassName; - private String fileClassName; - private String aclClassName; - private String fileUrl; - private String folderUrl; - private String moduleManagerOperations; - - private ViewColumnsXmlBean viewColumnsXmlBean; + private String id; + private String name; + private String folderClassName; + private String fileClassName; + private String aclClassName; + private String fileUrl; + private String folderUrl; + private String moduleManagerOperations; - public String getId() { - return id; - } + /** + * 附近保存的方法(本地或者数据库) + */ + private String saveMethod; - public void setId(String id) { - this.id = id; - } + /** + * 附近保存的地址 + */ + private String saveUrl; + private ViewColumnsXmlBean viewColumnsXmlBean; - public String getName() { - return name; - } + public String getId() { + return id; + } - public void setName(String name) { - this.name = name; - } + public void setId(String id) { + this.id = id; + } - public String getFolderClassName() { - return folderClassName; - } + public String getName() { + return name; + } - public void setFolderClassName(String folderClassName) { - this.folderClassName = folderClassName; - } + public void setName(String name) { + this.name = name; + } - public String getFileClassName() { - return fileClassName; - } + public String getFolderClassName() { + return folderClassName; + } - public void setFileClassName(String fileClassName) { - this.fileClassName = fileClassName; - } + public void setFolderClassName(String folderClassName) { + this.folderClassName = folderClassName; + } - public String getAclClassName() { - return aclClassName; - } + public String getFileClassName() { + return fileClassName; + } - public void setAclClassName(String aclClassName) { - this.aclClassName = aclClassName; - } + public void setFileClassName(String fileClassName) { + this.fileClassName = fileClassName; + } - public String getModuleManagerOperations() { - return moduleManagerOperations; - } + public String getAclClassName() { + return aclClassName; + } - public void setModuleManagerOperations(String moduleManagerOperations) { - this.moduleManagerOperations = moduleManagerOperations; - } + public void setAclClassName(String aclClassName) { + this.aclClassName = aclClassName; + } - public ViewColumnsXmlBean getViewColumnsXmlBean() { - return viewColumnsXmlBean; - } + public String getModuleManagerOperations() { + return moduleManagerOperations; + } - public void setViewColumnsXmlBean(ViewColumnsXmlBean viewColumnsXmlBean) { - this.viewColumnsXmlBean = viewColumnsXmlBean; - } + public void setModuleManagerOperations(String moduleManagerOperations) { + this.moduleManagerOperations = moduleManagerOperations; + } - public String getFileUrl() { - return fileUrl; - } + public ViewColumnsXmlBean getViewColumnsXmlBean() { + return viewColumnsXmlBean; + } - public void setFileUrl(String fileUrl) { - this.fileUrl = fileUrl; - } + public void setViewColumnsXmlBean(ViewColumnsXmlBean viewColumnsXmlBean) { + this.viewColumnsXmlBean = viewColumnsXmlBean; + } - public String getFolderUrl() { - return folderUrl; - } + public String getFileUrl() { + return fileUrl; + } - public void setFolderUrl(String folderUrl) { - this.folderUrl = folderUrl; - } - - + public void setFileUrl(String fileUrl) { + this.fileUrl = fileUrl; + } + + public String getFolderUrl() { + return folderUrl; + } + + public void setFolderUrl(String folderUrl) { + this.folderUrl = folderUrl; + } + + public String getSaveMethod() { + return saveMethod; + } + + public void setSaveMethod(String saveMethod) { + this.saveMethod = saveMethod; + } + + public String getSaveUrl() { + return saveUrl; + } + + public void setSaveUrl(String saveUrl) { + this.saveUrl = saveUrl; + } + + @Override + public String toString() { + return "ModuleXmlBean{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", folderClassName='" + folderClassName + '\'' + + ", fileClassName='" + fileClassName + '\'' + + ", aclClassName='" + aclClassName + '\'' + + ", fileUrl='" + fileUrl + '\'' + + ", folderUrl='" + folderUrl + '\'' + + ", moduleManagerOperations='" + moduleManagerOperations + '\'' + + ", saveMethod='" + saveMethod + '\'' + + ", saveUrl='" + saveUrl + '\'' + + '}'; + } } Index: forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java =================================================================== diff -u -r15657 -r15795 --- forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java (.../FileUtils.java) (revision 15657) +++ forgon-tools/src/main/java/com/forgon/tools/util/FileUtils.java (.../FileUtils.java) (revision 15795) @@ -9,11 +9,13 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; +import java.sql.Blob; import java.util.ArrayList; import java.util.List; @@ -241,4 +243,71 @@ int des_height = src.height + len_dalta_height * 2; return new java.awt.Rectangle(new Dimension(des_width, des_height)); } + /** + * 把文件保存到本地 + * + * @param fileStream 要被保存的文件的输入流 + * @param folder 要保存到的对应文件夹路径 + * @param fileName 要保存的文件名 + * @return + */ + public static boolean saveLocalFile(InputStream fileStream, String folder, String fileName) { + try { + File fileOut = new File(folder + fileName); + org.apache.commons.io.FileUtils.copyInputStreamToFile(fileStream, fileOut); + } + catch (Exception e) { + logger.error(e.getMessage(), e); + return false; + } + return true; + } + + + /** + * 将本地的文件用流的方式输出 + * @param out 输出流 + * @param path 该文件的路径 + */ + public static void writeOutStreamWithPath(OutputStream out, String path) { + try(InputStream is = new FileInputStream(new File(path))) { + writeFileOutStream(is, out); + } + catch (Exception e) { + logger.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + /** + * 将数据库的的文件用流的方式输出 + * @param out 输出流 + * @param blob 数据库里该文件的流 + */ + public static void writeOutStreamWithBlob(OutputStream out, Blob blob){ + try(InputStream is = blob.getBinaryStream()) { + writeFileOutStream(is, out); + } + catch (Exception e) { + logger.error(e.getMessage(), e); + throw new RuntimeException(e); + } + } + + /** + * 将对应的输入流输出,被writeOutStreamWithPath()和writeOutStreamWithBlob调用 + *

(注:这里的in和out不会关闭,需要调用者自己关闭)

+ * @param in {@link InputStream} + * @param out {@link OutputStream} + * @throws Exception + */ + private static void writeFileOutStream(InputStream in,OutputStream out) throws Exception{ + byte[] buffer = new byte[102400]; + int len; + while((len = in.read(buffer)) != -1){ + out.write(buffer,0, len); + } + } + + } Index: ssts-web/src/main/webapp/knowledge/viewExt.js =================================================================== diff -u -r15543 -r15795 --- ssts-web/src/main/webapp/knowledge/viewExt.js (.../viewExt.js) (revision 15543) +++ ssts-web/src/main/webapp/knowledge/viewExt.js (.../viewExt.js) (revision 15795) @@ -37,9 +37,14 @@ function updateFileAndFolder(){ var moduleId = getModuleId(); if(havaSelectedOnlyOne('文件或文件夹','id')){ + var row = grid.getSelectionModel().getSelections()[0]; + var folderId = "" + if (!isUndefinedOrNullOrEmpty(row.get('folderId'))){ + folderId = row.get('folderId'); + } var id = grid.getSelectedValues('prefixId', ';'); if(id.indexOf(fileIdPrefix) == 0 ){ - location.href = WWWROOT + "/networkdisk/addFileForm.mhtml?moduleId="+moduleId+"&Action=u&id="+id.substring(fileIdPrefix.length, id.length); + location.href = WWWROOT + "/networkdisk/addFileForm.mhtml?moduleId="+moduleId+"&Action=u&id="+id.substring(fileIdPrefix.length, id.length)+"&folderKeyId="+folderId; } else if(id.indexOf(folderIdPrefix) == 0){ location.href = WWWROOT + "/networkdisk/addFolderForm.mhtml?moduleId="+moduleId+"&id="+id.substring(folderIdPrefix.length, id.length); } @@ -86,28 +91,33 @@ function onClickTreeNode(node, e){ var nodeKeyId = node.attributes['keyId']; setTopToolbarDisabled(node); + Ext.fly("parm_s_parentId").dom.value = nodeKeyId; grid.gotoFirstPage(); - Ext.fly("parm_s_parentId").dom.value = nodeKeyId; - grid.dwrReload(); + // grid.dwrReload(); } function rendererImgLink(v, p, record){ var linkUrl = record.data['linkUrl']; var attachFileId = record.data['attachFileId']; - if(attachFileId != null && attachFileId != "" && attachFileId.indexOf(",") == -1){ - linkUrl = WWWROOT + "/attachfiles/fileDownLoad?loadType='open'&id=" + attachFileId; + if (!isUndefinedOrNullOrEmpty(attachFileId) && attachFileId.indexOf(",") == -1){ + linkUrl = WWWROOT + "/attachfiles/fileDownLoad?loadType='open'&id=" + attachFileId + "&moduleId=" + moduleId; v = ' ' + v + ''; - }else{ + } + else{ + //如果不为空,则目前加载的文件,要重新设置对应文件的url,如果是目前加载目录,这个url是一个js的方法 + if (!isUndefinedOrNullOrEmpty(record.get('folderId'))){ + linkUrl = WWWROOT + linkUrl; + } v = ' ' + v + ''; } return v; } -function moveUp(id){ +function moveUpFileOrFolder(id){ KnowledgeTableManager.moveUp(getModuleId(),id, function(){reloadTreeAndTable();}); } -function moveDown(id){ +function moveDownFileOrFolder(id){ KnowledgeTableManager.moveDown(getModuleId(), id, function(){reloadTreeAndTable();}); } @@ -137,11 +147,11 @@ } function rendererMoveColumn(v, s, r){ - var html = ''; + var html = ''; html += '向上移动   '; - html += ''; + html += ''; html += '向下移动'; - return html; + return html; } function upFolder(){ @@ -260,19 +270,20 @@ grid = new Ext.ux.ForgonPageGrid( { - tbar:tbar, - title:gridTitle, - pageSize:30, - defaultSortField:'sequenceNumber', - defaultSortDirection:'asc', - isCheckboxSelectionModel:isCheckboxSelectionModel, - plugins: filters, - columns: columns, - autoExpandColumn: 'name', - border:false, - isShowSearchField: false, - rememberSelected: false, - frame:false + id:'knowledgeGrid', + tbar:tbar, + title:gridTitle, + pageSize:30, + defaultSortField:'sequenceNumber', + defaultSortDirection:'asc', + isCheckboxSelectionModel:isCheckboxSelectionModel, + plugins: filters, + columns: columns, + autoExpandColumn: 'name', + border:false, + isShowSearchField: false, + rememberSelected: false, + frame:false }, readerDetail, KnowledgeTableManager.getGridViewTableList, Index: ssts-web/src/main/resources/knowledgeModule.xml =================================================================== diff -u -r15543 -r15795 --- ssts-web/src/main/resources/knowledgeModule.xml (.../knowledgeModule.xml) (revision 15543) +++ ssts-web/src/main/resources/knowledgeModule.xml (.../knowledgeModule.xml) (revision 15795) @@ -1,19 +1,20 @@ - + - + + fillter="true"/>c + fillter="true"/> + fillter="true"/> Index: ssts-web/src/main/webapp/themes/portalPage/img/training.png =================================================================== diff -u Binary files differ Index: ssts-web/src/main/resources/systemset/portalPage.xml =================================================================== diff -u -r15141 -r15795 --- ssts-web/src/main/resources/systemset/portalPage.xml (.../portalPage.xml) (revision 15141) +++ ssts-web/src/main/resources/systemset/portalPage.xml (.../portalPage.xml) (revision 15795) @@ -27,6 +27,7 @@ + \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/filedownload/service/FileDownLoadManagerImpl.java =================================================================== diff -u -r12331 -r15795 --- forgon-core/src/main/java/com/forgon/filedownload/service/FileDownLoadManagerImpl.java (.../FileDownLoadManagerImpl.java) (revision 12331) +++ forgon-core/src/main/java/com/forgon/filedownload/service/FileDownLoadManagerImpl.java (.../FileDownLoadManagerImpl.java) (revision 15795) @@ -9,6 +9,7 @@ import javax.servlet.ServletOutputStream; +import com.forgon.tools.util.FileUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -51,9 +52,20 @@ } AttachFile attachFile = attachFileNameList.get(0); try { - getAttachFileStream(out, attachFile.getAttachFileBinary()); - } catch (IOException e) { + //如果路径为空则用流的方式输出 + if (attachFile.getAttachFilePath() == null){ + FileUtils.writeOutStreamWithBlob(out, attachFile.getAttachFileBinary()); + } + //否则根据路径读取本地的文件,把文件用流的方式输出 + else{ + String path = attachFile.getAttachFilePath() + attachFile.getUUIDFileName(); + FileUtils.writeOutStreamWithPath(out, path); + } } + catch (Exception e) { + log.error(e,e); + throw new RuntimeException(e); + } } public void downLoadComoseFileWord(String objectName,String id, OutputStream out) { @@ -70,9 +82,12 @@ Blob wordBlob = composeWordDoc.getWordDocBinary(); try { - getAttachFileStream(out, wordBlob); - } catch (IOException e) { + FileUtils.writeOutStreamWithBlob(out, wordBlob); } + catch (Exception e) { + log.error(e,e); + throw new RuntimeException(e); + } } @SuppressWarnings("unchecked") @@ -145,30 +160,7 @@ e.printStackTrace(); } } - private void getAttachFileStream(OutputStream out, Blob blob) throws IOException{ - byte[] buffer = new byte[102400]; - InputStream is = null; - try { - is = blob.getBinaryStream(); - int len; - while((len = is.read(buffer)) != -1){ - out.write(buffer,0, len); - } - out.close(); - is.close(); - } catch (Exception e) { - log.error("下载正文出错!"); -// e.printStackTrace(); - } finally { - if(out != null ){ - out.close(); - } - if(is != null ){ - is.close(); - } - } - } @SuppressWarnings("unchecked") private boolean isOnlyOneAttachFile(String fileId){ Index: ssts-web/src/main/webapp/networkdisk/addFile.jsp =================================================================== diff -u -r15543 -r15795 --- ssts-web/src/main/webapp/networkdisk/addFile.jsp (.../addFile.jsp) (revision 15543) +++ ssts-web/src/main/webapp/networkdisk/addFile.jsp (.../addFile.jsp) (revision 15795) @@ -5,7 +5,6 @@ 创建文件 - <%@ include file="/common/includeUploadFilesJSAndCSS.jsp"%> @@ -19,6 +18,7 @@ + Index: forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileSaveType.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileSaveType.java (revision 0) +++ forgon-core/src/main/java/com/forgon/attachfile/enums/AttachFileSaveType.java (revision 15795) @@ -0,0 +1,36 @@ +package com.forgon.attachfile.enums; + +/** + * Created by zhonghaowen on 2016/11/4. + * 附件保存类型 + */ +public enum AttachFileSaveType { + + LOCAL(1, "保存到本地"), + DATABASE(2, "保存到数据库"); + private String desc; + private Integer val; + + AttachFileSaveType(Integer val, String desc) { + this.val = val; + this.desc = desc; + } + + public String getDesc() { + return desc; + } + + public Integer getVal() { + return val; + } + + public static AttachFileSaveType parseOfDesc(String desc) { + AttachFileSaveType[] values = AttachFileSaveType.values(); + for (AttachFileSaveType value : values) { + if (value.getDesc().equals(desc)) { + return value; + } + } + throw new IllegalArgumentException("找不到对应的类型"); + } +} Index: ssts-web/src/main/webapp/networkdisk/addFolder.jsp =================================================================== diff -u -r15543 -r15795 --- ssts-web/src/main/webapp/networkdisk/addFolder.jsp (.../addFolder.jsp) (revision 15543) +++ ssts-web/src/main/webapp/networkdisk/addFolder.jsp (.../addFolder.jsp) (revision 15795) @@ -123,7 +123,7 @@ 文件夹名称* - + Index: ssts-web/src/main/webapp/js/uploadFiles.js =================================================================== diff -u -r12331 -r15795 --- ssts-web/src/main/webapp/js/uploadFiles.js (.../uploadFiles.js) (revision 12331) +++ ssts-web/src/main/webapp/js/uploadFiles.js (.../uploadFiles.js) (revision 15795) @@ -23,6 +23,16 @@ } +/** + * 播放视频 + * @param me + * @param moduleId 模块id + * @param id 附件id + */ +function playVideo(me, moduleId, id) { + me.href = webCtxRoot + '/attachfiles/fileDownLoad?loadType=play&id=' + id + '&moduleId=' + moduleId; +} + //调用DWR显示附件列表 function displayAttachFiles(fObjName){ if(fObjName==""){ @@ -36,21 +46,29 @@ function showAttachFileList(attachFileList){ - var attachUrl = "移除附件"; - + + var playAttachFileBtnBegin = "   播放"; + var attachFileTitleObject = document.getElementById("attachFileTitle"); if(attachFileList.length == 0 && attachFileTitleObject != null && enableEditField==false){ attachFileTitleObject.innerHTML = ""; } - - + for(var i=0; i"+attachFileVO.attachFileName+"" if(enableEditField){ strHtml += delAttachFileBeginStr + attachFileVO.id + delAttachFileEndStr ; + var suffix = attachFileVO.attachType; + var type = judgeAttachTypeBySuffix(suffix.substr(1)); + if (type == AttachFileType.getVideo()){ + //如果该附件是视频文件,则生成视频播放按钮 + strHtml += playAttachFileBtnBegin + moduleId + "'" + ",'" + attachFileVO.id + playAttachFileBtnEnd ; + } } var fileName = document.createElement("span"); fileName.className = "filelistItem"; @@ -59,6 +77,42 @@ } } +/** + * 根据附件的后缀判断类型 + * @param suffix 附件的后缀 + * @returns {*} 返回判断后的类型 + */ +function judgeAttachTypeBySuffix(suffix) { + var attachFileType; + switch (suffix) { + case "mkv": + case "avi": + case "rmvb": + case "rm": + case "mpg": + case "mp4": + case "ogg": + case "flv": + case "mov": + case "wmv": + case "3gp": + attachFileType = AttachFileType.getVideo(); + break; + case "doc": + case "xls": + case "ppt": + case "docx": + case "xlsx": + case "pptx": + attachFileType = AttachFileType.getOffice(); + break; + default: + attachFileType = AttachFileType.getOther(); + break; + } + return attachFileType; +} + function deleteAttachFile(obj,attachFileId){ //删除共享附件,邮件专用 var fkeyId = DWRUtil.getValue('id'); Index: forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java =================================================================== diff -u -r15543 -r15795 --- forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java (.../KnowledgeFileController.java) (revision 15543) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/controller/KnowledgeFileController.java (.../KnowledgeFileController.java) (revision 15795) @@ -1,23 +1,6 @@ package com.forgon.knowledge.controller; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.beanutils.BeanUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.FastDateFormat; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; - +import com.forgon.attachfile.model.AttachFile; import com.forgon.attachfile.service.AttachFileManager; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; @@ -29,16 +12,32 @@ import com.forgon.knowledge.xmlbean.ModuleXmlBean; import com.forgon.tools.AppKeys; import com.forgon.treenode.service.THTreeNodeManager; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.time.FastDateFormat; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.ModelAndView; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.List; + /** * @author BYuan - * + * */ @Controller public class KnowledgeFileController { - protected final transient Logger logger = Logger - .getLogger(KnowledgeFileController.class); + protected final transient Logger logger = Logger.getLogger(this.getClass()); private static String ATTACH_FILE_IDS = "attachFileIds"; @@ -49,13 +48,13 @@ private AttachFileManager attachFileManager; private KnowledgeModuleManager knowledgeModuleManager; - + private SysUserManager sysUserManager; public void setSysUserManager(SysUserManager sysUserManager) { this.sysUserManager = sysUserManager; } - + public void setAttachFileManager(AttachFileManager attachFileManager) { this.attachFileManager = attachFileManager; } @@ -72,57 +71,40 @@ KnowledgeModuleManager knowledgeModuleManager) { this.knowledgeModuleManager = knowledgeModuleManager; } - - @RequestMapping(value = "/networkdisk/addFileForm.mhtml", method=RequestMethod.POST) - public ModelAndView onSubmit(HttpServletRequest request, - HttpServletResponse response, @ModelAttribute("AddFileForm")KnowledgeFile command) - throws Exception { - logger.debug("entering 'onSubmit' method..."); - - Long id = command.getId(); - String moduleId = request.getParameter("moduleId"); - ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); - // 获取文件类的类名 - String fileClassName = moduleXmlBean.getFileClassName(); - // 获取文件夹类的类名 - String folderClassName = moduleXmlBean.getFolderClassName(); - - // 创建文件类对应的子类,这样能保证Hibernate能根据子类的类型,正确保存到对应的数据库表中 - KnowledgeFile subObject = (KnowledgeFile)Class.forName(fileClassName).newInstance(); - - subObject.setFolder((KnowledgeFolder)Class.forName(folderClassName).newInstance()); - - BeanUtils.copyProperties(subObject, command); - - // 获取所在的文件夹对象 - String folderKeyId = request.getParameter("folderKeyId"); - Long folderId = Long.valueOf(0); - if (StringUtils.isNotEmpty(folderKeyId)) { - folderId = Long.parseLong(folderKeyId); + @RequestMapping(value = "/networkdisk/loadVideo.mhtml") + public String loadVideo(@RequestParam("attachFileId") String attachFileId, @RequestParam("moduleId") String moduleId, ModelMap map){ + AttachFile attachFile = attachFileManager.getById(attachFileId); + //读取配置文件,获得保存的路径 + ModuleXmlBean trainingManage = knowledgeModuleManager.getModuleXmlBeanById(moduleId); + String saveUrl = trainingManage.getSaveUrl(); + if (attachFile != null && StringUtils.isNotBlank(saveUrl)){ + //因为视频是从tomcat虚拟目录读取的,所以要把实际存在的路径的根目录置空,jsp页面访问的路径就是从根目录开始 + String attachFilePath = attachFile.getAttachFilePath(); + map.put("videoPath", attachFilePath.replace(saveUrl, "") + attachFile.getUUIDFileName()); + map.put("fileName", attachFile.getFileName()); } + return "/knowledge/knowledgeVideo"; + } - KnowledgeFolder folder = (KnowledgeFolder) thTreeNodeManager - .getTHTreeNodeById(moduleXmlBean.getFolderClassName(), - folderId); - subObject.setFolder(folder); - - - attachFileManager.saveAttachFiles(request, subObject); - knowledgeFileManager.submit(subObject); - String msg = ""; - if (id != null) { - msg = "修改文件成功!"; - } else { - msg = "添加文件成功!"; + + @RequestMapping(value = "/networkdisk/addFileForm.mhtml", method=RequestMethod.POST) + public ModelAndView onSubmit(HttpServletRequest request, @ModelAttribute("AddFileForm")KnowledgeFile command) throws Exception { + try { + logger.debug("entering 'onSubmit' method..."); + String moduleId = request.getParameter("moduleId"); + knowledgeFileManager.handleUpLoadFile(command, moduleId, request); + request.setAttribute(AppKeys.TipMsgKey, command.getId() != null ? "修改文件成功!":"添加文件成功!"); + request.setAttribute(AppKeys.RedirectTo, request.getContextPath() + "/knowledge/view.do?moduleId=" + moduleId); + return new ModelAndView("/common/ReloadSelf"); } - request.setAttribute(AppKeys.TipMsgKey, msg); - request.setAttribute(AppKeys.RedirectTo, request.getContextPath() - + "/knowledge/view.do?moduleId="+moduleId); - return new ModelAndView("/common/ReloadSelf"); + catch (Exception e) { + logger.error(e,e); + throw new RuntimeException(e); + } } - + @RequestMapping(value = "/networkdisk/addFileForm.mhtml", method=RequestMethod.GET) protected Object formBackingObject(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception { @@ -137,17 +119,17 @@ ModuleXmlBean moduleXmlBean = knowledgeModuleManager.getModuleXmlBeanById(moduleId); String fileClassName = moduleXmlBean.getFileClassName(); request.setAttribute("fileSubClassName", knowledgeModuleManager.getFileClassSimpleNameByModuleId(moduleId)); - + KnowledgeFile po = null; if (StringUtils.isNotEmpty(id) && !id.equals("0")) { po = knowledgeFileManager.getById(moduleId, id); - - + + folderKeyId = po.getFolder().getId() + ""; request.setAttribute("folderKeyId", folderKeyId); // 需要设置值,在页面取到 TODO - + request.setAttribute(ATTACH_FILE_IDS, po.getAttachFiles()); } else { @@ -164,7 +146,7 @@ po.setCreator(AcegiHelper.getLoginUser().getUserFullName()); po.setCreateDate(FastDateFormat.getInstance("yyyy-MM-dd").format( new Date())); - + po.setAdministrators(com.forgon.tools.Constants.ROLE_ADMINISTRATOR_0+";USERID_" + AcegiHelper.getLoginUser().getUserName()); po.setAdministratorsForDisplay("系统管理员;" + AcegiHelper.getLoginUser().getUserFullName()); List companyList = sysUserManager.getUserCompanyList(OrgUnit.ORGUNIT_TYPE_COMPANY); @@ -182,8 +164,8 @@ } } //request.setAttribute("AddFileForm", po); - - + + model.addAttribute("AddFileForm",po); return "/networkdisk/addFile"; } Index: forgon-core/src/main/java/com/forgon/filedownload/servlet/FileDownLoadServlet.java =================================================================== diff -u -r12331 -r15795 --- forgon-core/src/main/java/com/forgon/filedownload/servlet/FileDownLoadServlet.java (.../FileDownLoadServlet.java) (revision 12331) +++ forgon-core/src/main/java/com/forgon/filedownload/servlet/FileDownLoadServlet.java (.../FileDownLoadServlet.java) (revision 15795) @@ -10,6 +10,10 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.forgon.attachfile.enums.AttachFileType; +import com.forgon.attachfile.model.AttachFile; +import com.forgon.attachfile.service.AttachFileManager; +import com.forgon.tools.util.FileUtils; import org.apache.commons.lang.StringUtils; import com.forgon.filedownload.service.FileDownLoadManager; @@ -37,23 +41,50 @@ FileDownLoadManager fileDownLoadManager = (FileDownLoadManager)SpringBeanManger.getBean("fileDownLoadManager"); - + + AttachFileManager attachFileManager = (AttachFileManager)SpringBeanManger.getBean("attachFileManager"); + if(StringUtils.equals(loadType, "word")){ OutputStream out = response.getOutputStream(); fileDownLoadManager.downLoadComoseFileWord(request.getParameter("objectName"),id, out); } else if(StringUtils.equals(loadType, "open") || StringUtils.equals(loadType, "'open'")){ - directOpenAttachFile(response, id, fileDownLoadManager); + AttachFileType attachFileType = attachFileManager.getAttachTypeById(id); + //如果是视频文件,直接播放 + if (AttachFileType.VIDEO.equals(attachFileType)){ + response.sendRedirect(this.getPlayVideoUrl(request, id)); + return; + } + directOpenAttachFile(response, id, fileDownLoadManager); } else if(StringUtils.equals(loadType, "template")){ OutputStream out = response.getOutputStream(); fileDownLoadManager.downLoadTemplateFile(id, out); } else if(StringUtils.equals(loadType, "inner")){ downloadInnerFile(request, response, id, fileDownLoadManager); - }else { + } + else if (StringUtils.equals(loadType, "play")){ + response.sendRedirect(this.getPlayVideoUrl(request, id)); + } + else { downloadAttachFile(response, id, fileDownLoadManager); } } + /** + * 获得播放视频的url + * @param request + * @param id 附件的id + * @return + */ + private String getPlayVideoUrl(HttpServletRequest request, String id){ + String moduleId = request.getParameter("moduleId"); + String url = request.getContextPath() + "/networkdisk/loadVideo.mhtml?attachFileId=" + id; + if (StringUtils.isNotBlank(moduleId)){ + url += "&moduleId=" + moduleId; + } + return url; + } + private void directOpenAttachFile(HttpServletResponse response, String id, FileDownLoadManager fileDownLoadManager) throws IOException { String fileName = getAttachFileName(id, fileDownLoadManager); Index: ssts-web/src/main/webapp/js/extCompOperationUtil.js =================================================================== diff -u --- ssts-web/src/main/webapp/js/extCompOperationUtil.js (revision 0) +++ ssts-web/src/main/webapp/js/extCompOperationUtil.js (revision 15795) @@ -0,0 +1,78 @@ +/** + * extJS组件操作工具类,用来操作组件 + */ +var extCompOperationUtil = (function () { + + var gOperation; + /** + * extJS组件操作工具类工厂,用来返回需要创建的对象,以后扩展可以通过增加对应的组件操作对象,然后用这个工厂返回 + * @constructor + */ + var ExtCompOperationUtilFactory = function () { + this.getGridOperation = function () { + if (isUndefinedOrNullOrEmpty(gOperation)){ + gOperation = new GridOperation(); + } + return gOperation; + } + } + //grid表单操作对象,支持每行上,下,置顶,置底操作 + var GridOperation = function () { + /** + * 移动顺序(只对grid表单有效,公共方法,给外面调用) + * @param motion 移动的方向(上,下,置顶,置底) + * @param gridId (可选)对应grid的Id + */ + this.operationMove = function (motion, gridId) { + //从common.js获取对应的extJs对象版本 + var extObj = getExtObj(); + //如果不传gridId,则使用页面中的grid对象 + var grid = extObj.getCmp(gridId) || grid; + var store = grid.getStore(); + var rows = grid.getSelectionModel().getSelections(); + if (rows) { + extObj.each(rows, function (row) { + var index = store.indexOf(row); + var operation = getHowToMove(motion, store.getCount(), index); + if (operation != null && index != operation.border) { + store.remove(row); + store.insert(operation.pos, row); + } + }); + } + }; + /** + * 获取怎么样移动(私有方法,只能在内部调用) + * @param motion 移动的方向(上,下,置顶,置底) + * @param size 这个grid的最大行数 + * @param rowIndex 选中的改行所在行数 + * @returns {{}} + */ + getHowToMove = function (motion, size, rowIndex) { + var operation = {}; + // border是边界值判断(即最上和最低的位置) + // pos是要插入的对应位置 + if (motion == 'up') { + operation.border = 0; + operation.pos = rowIndex - 1; + } + else if (motion == 'down') { + operation.border = size - 1; + operation.pos = rowIndex + 1; + } + else if (motion == 'top') { + operation.border = operation.pos = 0; + } + else if (motion == 'bottom') { + operation.border = operation.pos = size - 1; + } + else { + operation = null; + } + return operation; + } + } + + return new ExtCompOperationUtilFactory(); + +})(); \ No newline at end of file Index: forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java =================================================================== diff -u -r12331 -r15795 --- forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java (.../AttachFileVO.java) (revision 12331) +++ forgon-core/src/main/java/com/forgon/attachfile/vo/AttachFileVO.java (.../AttachFileVO.java) (revision 15795) @@ -1,35 +1,68 @@ /** - * + * */ package com.forgon.attachfile.vo; /** * @author yuanbin - * */ public class AttachFileVO { - private Long id; - private String attachFileName; - private String contentType; - - public String getAttachFileName() { - return attachFileName; - } - public void setAttachFileName(String attachFileName) { - this.attachFileName = attachFileName; - } - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getContentType() { - return contentType; - } - public void setContentType(String contentType) { - this.contentType = contentType; - } + private Long id; + private String contentType; + private String attachType; + private String attachFileName; - + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getContentType() { + return contentType; + } + + public void setContentType(String contentType) { + this.contentType = contentType; + } + + public String getAttachType() { + return attachType; + } + + public void setAttachType(String attachType) { + this.attachType = attachType; + } + + public String getAttachFileName() { + return attachFileName; + } + + public void setAttachFileName(String attachFileName) { + this.attachFileName = attachFileName; + } + + public AttachFileVO() { + } + + public AttachFileVO(Long id, String contentType, String attachType, String attachFileName) { + this.id = id; + this.contentType = contentType; + this.attachType = attachType; + this.attachFileName = attachFileName; + } + + @Override + public String toString() { + return "AttachFileVO{" + + "id=" + id + + ", contentType='" + contentType + '\'' + + ", attachType='" + attachType + '\'' + + ", attachFileName='" + attachFileName + '\'' + + '}'; + } } Index: ssts-web/src/main/webapp/knowledge/knowledgeVideo.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/knowledge/knowledgeVideo.jsp (revision 0) +++ ssts-web/src/main/webapp/knowledge/knowledgeVideo.jsp (revision 15795) @@ -0,0 +1,27 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Title + + + + + + + + + + + + + + + + + + + + + Index: forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java =================================================================== diff -u -r13416 -r15795 --- forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java (.../AttachFileManagerImpl.java) (revision 13416) +++ forgon-core/src/main/java/com/forgon/attachfile/service/AttachFileManagerImpl.java (.../AttachFileManagerImpl.java) (revision 15795) @@ -1,398 +1,520 @@ package com.forgon.attachfile.service; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.sql.Blob; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; -import org.hibernate.Hibernate; -import org.hibernate.Session; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.multipart.MultipartHttpServletRequest; - +import com.beust.jcommander.ParameterException; +import com.forgon.attachfile.enums.AttachFileSaveType; +import com.forgon.attachfile.enums.AttachFileType; import com.forgon.attachfile.model.AttachFile; import com.forgon.attachfile.model.AttachFileInterface; import com.forgon.attachfile.vo.AttachFileVO; import com.forgon.tools.AppKeys; import com.forgon.tools.guid.GUIDGenerator; import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.FileUtils; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.hibernate.Hibernate; +import org.hibernate.SQLQuery; +import org.hibernate.Session; +import org.hibernate.transform.Transformers; +import org.hibernate.type.LongType; +import org.hibernate.type.StringType; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.sql.Blob; +import java.util.*; + + /** * @author yuanbin - * */ public class AttachFileManagerImpl implements AttachFileManager { - private ObjectDao objectDao; + protected Logger logger = Logger.getLogger(this.getClass()); - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } + private ObjectDao objectDao; - public void deleteAllAttachFile(String attachFileIds) { - if (StringUtils.isNotBlank(attachFileIds)) { - String[] attachfilesIdArr = attachFileIds - .split(AttachFileInterface.ATTACHFILES_SEPARATOR); - for (String id : attachfilesIdArr) { - AttachFile attachFile = (AttachFile) objectDao.getByProperty( - "AttachFile", "id", Long.valueOf(id)); - objectDao.delete(attachFile); - } - } - } - public void deleteAttachFile(String formObjectName, String formId, - String attachFileId) { - if (formObjectName == null || formId == null || attachFileId == null) { - return; - } + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } - AttachFileInterface attachFileInterface = (AttachFileInterface) objectDao - .getByProperty(formObjectName, "id", Long.valueOf(formId)); + public void deleteAllAttachFile(String attachFileIds) { + if (StringUtils.isNotBlank(attachFileIds)) { + String[] attachfilesIdArr = attachFileIds + .split(AttachFileInterface.ATTACHFILES_SEPARATOR); + for (String id : attachfilesIdArr) { + AttachFile attachFile = (AttachFile) objectDao.getByProperty( + "AttachFile", "id", Long.valueOf(id)); + objectDao.delete(attachFile); + } + } + } - if (attachFileInterface.getAttachFiles() != null) { - String[] attachfilesArr = attachFileInterface.getAttachFiles() - .split(AttachFileInterface.ATTACHFILES_SEPARATOR); - if (ArrayUtils.contains(attachfilesArr, attachFileId)) { - attachfilesArr = (String[]) ArrayUtils.removeElement( - attachfilesArr, attachFileId); - } - attachFileInterface.setAttachFiles(StringUtils.join(attachfilesArr, - AttachFileInterface.ATTACHFILES_SEPARATOR)); - } + public void deleteAttachFile(String formObjectName, String formId, String attachFileId) { + try { + if (formObjectName == null || formId == null || attachFileId == null) { + return; + } + AttachFileInterface attachFileInterface = (AttachFileInterface) objectDao.getByProperty(formObjectName, "id", Long.valueOf(formId)); + if (attachFileInterface.getAttachFiles() != null) { + String[] attachfilesArr = attachFileInterface.getAttachFiles().split(AttachFileInterface.ATTACHFILES_SEPARATOR); + if (ArrayUtils.contains(attachfilesArr, attachFileId)) { + attachfilesArr = (String[]) ArrayUtils.removeElement(attachfilesArr, attachFileId); + } + attachFileInterface.setAttachFiles(StringUtils.join(attachfilesArr, AttachFileInterface.ATTACHFILES_SEPARATOR)); + } + objectDao.saveOrUpdate(attachFileInterface); + AttachFile attachFile = (AttachFile) objectDao.getByProperty("AttachFile", "id", Long.valueOf(attachFileId)); + objectDao.delete(attachFile); + //如果存在文件路径,则表示是保存在本地,删除附件在数据库数据后再删除本地文件 + String attachFilePath = attachFile.getAttachFilePath(); + if (StringUtils.isNotBlank(attachFilePath)) { + org.apache.commons.io.FileUtils.deleteQuietly(new File(attachFilePath + attachFile.getUUIDFileName())); + } + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } - objectDao.saveOrUpdate(attachFileInterface); + } - AttachFile attachFile = (AttachFile) objectDao.getByProperty( - "AttachFile", "id", Long.valueOf(attachFileId)); - objectDao.delete(attachFile); + public List getAttachFilesIdAndFileName( + String formObjectName, String formId) { + List list = new ArrayList(); - } + if (StringUtils.isBlank(formObjectName) || StringUtils.isBlank(formId)) { + return list; + } - public List getAttachFilesIdAndFileName( - String formObjectName, String formId) { - List list = new ArrayList(); + AttachFileInterface attachFileInterface = (AttachFileInterface) objectDao + .getByProperty(formObjectName, "id", Long.valueOf(formId)); + if (attachFileInterface == null) { + return list; + } - if (StringUtils.isBlank(formObjectName) || StringUtils.isBlank(formId)) { - return list; - } + String attachFileKeyIds = attachFileInterface.getAttachFiles(); - AttachFileInterface attachFileInterface = (AttachFileInterface) objectDao - .getByProperty(formObjectName, "id", Long.valueOf(formId)); - if (attachFileInterface == null) - return list; + list = getAttachFilesIdAndFileNameByAttachIds(attachFileKeyIds); - String attachFileKeyIds = attachFileInterface.getAttachFiles(); + return list; + } - list = getAttachFilesIdAndFileNameByAttachIds(attachFileKeyIds); + @SuppressWarnings("unchecked") + public List getAttachFilesIdAndFileNameByAttachIds(String attachFileIds) { + List list = new ArrayList(); + if (StringUtils.isBlank(attachFileIds)) { + return list; + } + String sql = "select new com.forgon.attachfile.vo.AttachFileVO(id,contentType,attachType,fileName) from AttachFile po where po.id in (" + + attachFileIds + ")"; + list = objectDao.findByHql(sql); + return list; + } - return list; - } + @SuppressWarnings("unchecked") + public void saveAttachFiles(HttpServletRequest request, Object object) { - @SuppressWarnings("unchecked") - public List getAttachFilesIdAndFileNameByAttachIds( - String attachFileIds) { - List list = new ArrayList(); + if (object == null) { + return; + } - if (StringUtils.isBlank(attachFileIds)) - return list; + AttachFileInterface attachFileInterface = (AttachFileInterface) object; - String sql = "select po.id as id, po.fileName as fileName, po.contentType as contentType from AttachFile po where po.id in (" - + attachFileIds + ")"; - List attachFileList = objectDao.findByHql(sql); - for (Object[] result : attachFileList) { - AttachFileVO attachFileVO = new AttachFileVO(); - attachFileVO.setId(Long.valueOf(result[0].toString())); - attachFileVO.setAttachFileName((String) result[1]); - if (result[2] != null) { - attachFileVO.setContentType((String) result[2]); - } + String attachfiles = attachFileInterface.getAttachFiles(); - list.add(attachFileVO); - } - return list; - } + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + for (Iterator it = multipartRequest.getFileNames(); it.hasNext(); ) { + String key = (String) it.next(); + if (StringUtils.isBlank(key) + || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { + continue; + } + try { + MultipartFile file = multipartRequest.getFile(key); - @SuppressWarnings("unchecked") - public void saveAttachFiles(HttpServletRequest request, Object object) { + if (file == null || file.isEmpty()) { + continue; + } - if (object == null) { - return; - } + AttachFile attachFile = new AttachFile(); - AttachFileInterface attachFileInterface = (AttachFileInterface) object; + Session session = objectDao.getHibernateSession(); + Blob attachFileBlob = Hibernate.getLobCreator(session).createBlob(file.getBytes()); - String attachfiles = attachFileInterface.getAttachFiles(); - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) { - String key = (String) it.next(); - if (StringUtils.isBlank(key) - || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { - continue; - } - try { - MultipartFile file = multipartRequest.getFile(key); + attachFile.setAttachFileBinary(attachFileBlob); + attachFile.setFileName(file.getOriginalFilename()); + attachFile.setContentType(file.getContentType()); + String id = objectDao.saveAndReturnProperty(attachFile, "id"); + attachfiles = StringTools.uniteTwoStringBySemicolon( + attachfiles, id, + AttachFileInterface.ATTACHFILES_SEPARATOR); - if (file == null || file.isEmpty()) - continue; + } + catch (IOException e) { + e.printStackTrace(); + } - AttachFile attachFile = new AttachFile(); - - Session session = objectDao.getHibernateSession(); - Blob attachFileBlob = Hibernate.getLobCreator(session).createBlob(file.getBytes()); - + } - attachFile.setAttachFileBinary(attachFileBlob); - attachFile.setFileName(file.getOriginalFilename()); - attachFile.setContentType(file.getContentType()); - String id = objectDao.saveAndReturnProperty(attachFile, "id"); - attachfiles = StringTools.uniteTwoStringBySemicolon( - attachfiles, id, - AttachFileInterface.ATTACHFILES_SEPARATOR); + // 将上传的附件ID关联到上传表单中去 + attachFileInterface.setAttachFiles(attachfiles); - } catch (IOException e) { - e.printStackTrace(); - } + } - } + public Set getAttachFilesFromRequest(HttpServletRequest request) { + Set attachFiles = new HashSet(); - // 将上传的附件ID关联到上传表单中去 - attachFileInterface.setAttachFiles(attachfiles); + return attachFiles; + } - } + @Override + public String[] batchSaveAttachFilesToFileSystem(HttpServletRequest request, String folder) { + String[] returnFileNames = null; + try { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + for (Iterator it = multipartRequest.getFileNames(); it.hasNext(); ) { + String key = it.next(); + MultipartFile file = multipartRequest.getFile(key); + if (this.checkUpLoadMsg(key, file)) { + continue; + } + try (InputStream fileStream = file.getInputStream()) { + String fileName = this.setSaveFileGUIDName(file.getOriginalFilename()); + returnFileNames = this.saveFileAndReturnNames(fileStream, folder, fileName, returnFileNames); + } + } + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + return returnFileNames; + } - public Set getAttachFilesFromRequest(HttpServletRequest request) { - Set attachFiles = new HashSet(); - return attachFiles; - } + @Override + public String[] batchSaveAttachFilesToFileSystem(File[] files, String[] fileNames, String folder) { + String[] returnFileNames = null; + try { + for (int i = 0; i < files.length; i++) { + File file = files[i]; + if (file == null) { + continue; + } + try (InputStream fileStream = new FileInputStream(file)) { + String fileName = this.setSaveFileGUIDName(fileNames[i]); + returnFileNames = this.saveFileAndReturnNames(fileStream, folder, fileName, returnFileNames); + } + } + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + return returnFileNames; + } - /** - * 将附件保存到文件系统(Spring) - * - * @param request - * 页面的request - * @param folder - * 文件夹的位置 - */ - @SuppressWarnings("unchecked") - public String[] saveAttachFilesToFileSystem(HttpServletRequest request, - String folder) { + /** + * 根据guid编码重新设置保存文件的名字 + * + * @param originalFileName 原文件名 + * @return + */ + private String setSaveFileGUIDName(String originalFileName) { + String microFileName = GUIDGenerator.genGUID(); + String postfix = originalFileName.substring(originalFileName.lastIndexOf(".")); + return microFileName + postfix; + } - String[] fileNames = null; - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + /** + * 保存文件并返回保存后的文件名字 + * + * @param fileStream 文件输入流 + * @param folder 保存文件的文件夹路径 + * @param GUIDFileName 经过GUID更改后的文件名 + * @param returnFileNames 返回的文件名字 + * @return + */ + private String[] saveFileAndReturnNames(InputStream fileStream, String folder, String GUIDFileName, String[] returnFileNames) { + if (FileUtils.saveLocalFile(fileStream, folder, GUIDFileName)) { + returnFileNames = (String[]) ArrayUtils.add(returnFileNames, GUIDFileName); + } + return returnFileNames; + } - for (Iterator it = multipartRequest.getFileNames(); it.hasNext();) { - String key = (String) it.next(); - if (StringUtils.isBlank(key) - || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { - continue; - } - try { - MultipartFile file = multipartRequest.getFile(key); - if (file == null || file.isEmpty()) { - continue; - } - InputStream fileStream = file.getInputStream(); - String microFileName = GUIDGenerator.genGUID(); - String originalFileName = file.getOriginalFilename(); - String postfix = originalFileName.substring(originalFileName - .lastIndexOf(".")); - String fileName = microFileName + postfix; + /** + * 根据request得到所有上传附件的输入字节流 + */ + @SuppressWarnings("unchecked") + public List getInputStreamFromAttachFile( + HttpServletRequest request) { + List imputStreamList = new ArrayList(); + if (request instanceof MultipartHttpServletRequest) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Iterator it = multipartRequest.getFileNames(); + while (it.hasNext()) { + String key = (String) it.next(); + if (StringUtils.isBlank(key) + || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { + continue; + } + try { + MultipartFile file = multipartRequest.getFile(key); - if (saveFile(fileStream, folder, fileName)) { - fileNames = (String[]) ArrayUtils.add(fileNames, fileName); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return fileNames; - } + String name = file.getName(); + name = file.getOriginalFilename(); + if (file == null || file.isEmpty()) { + continue; + } + imputStreamList.add(file.getInputStream()); + } + catch (IOException e) { + return null; + } + } + } + return imputStreamList; + } - /** - * 将附件保存到文件系统(Struts2) - * - * @param files - * 文件类数组 - * @param fileNames - * 文件名称数组 - * @param folder - * 文件夹的位置 - */ - public String[] saveAttachFilesToFileSystem(File[] files, - String[] fileNames, String folder) { - String[] returnFileNames = null; - for (int i = 0; i < files.length; i++) { - File file = files[i]; - try { - if (file == null) { - continue; - } - InputStream fileStream = new FileInputStream(file); - String microFileName = GUIDGenerator.genGUID(); - String postfix = fileNames[i].substring(fileNames[i] - .lastIndexOf(".")); - String fileName = microFileName + postfix; + public AttachFile getById(String id) { + AttachFile attachFile = null; + if (StringUtils.isNotBlank(id)) { + attachFile = (AttachFile) objectDao.getByProperty(AttachFile.class + .getSimpleName(), "id", Long.valueOf(id)); + } + return attachFile; + } - if (saveFile(fileStream, folder, fileName)) { - returnFileNames = (String[]) ArrayUtils.add( - returnFileNames, fileName); - } - } catch (Exception e) { - e.printStackTrace(); - } - } + public void creaseReferenceCountByIds(String ids, int number) { + if (StringUtils.isNotBlank(ids)) { + String sql = " where po.id in(" + ids + ") "; + List list = objectDao.findBySql(AttachFile.class.getSimpleName(), + sql); + for (Object o : list) { + AttachFile attachFile = (AttachFile) o; + attachFile.creaseReferenceCount(number); + objectDao.saveOrUpdate(attachFile); + } + } + } - return returnFileNames; - } - private boolean saveFile(InputStream fileStream, String folder, - String fileName) { - File folderFile = new File(folder); - if (!folderFile.isDirectory()) { - folderFile.mkdir(); - } - File f = new File(folder + fileName); - if (f.exists()) { - return false; - } - FileOutputStream fos = null; - if (!f.exists()) { - try { - f.createNewFile(); - fos = new FileOutputStream(f); - byte b[] = new byte[1024]; - int factReadBytes = -1; - while ((factReadBytes = fileStream.read(b)) != -1) { - fos.write(b, 0, factReadBytes); - } - } catch (IOException e) { - e.printStackTrace(); - return false; - } finally { - try { - fos.close(); - fileStream.close(); - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - } - return true; - } + @Override + public void handleSaveAttachFiles(HttpServletRequest request, Object object, Map map) { + try { + if (object == null) { + throw new ParameterException("AttachFileInterface对象不能是空!"); + } + AttachFileInterface attachFileInterface = (AttachFileInterface) object; + String attachFiles = attachFileInterface.getAttachFiles(); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + //本地文件保存路径的list,用于上传出错时保存成功上传了的文件的路径,在异常处理时删掉这些文件 + List fileSavePathLists = new ArrayList<>(); + //遍历需要处理的上传附件 + for (Iterator it = multipartRequest.getFileNames(); it.hasNext(); ) { + String key = it.next(); + MultipartFile file = multipartRequest.getFile(key); + if (this.checkUpLoadMsg(key, file)) { + continue; + } + AttachFile attachFile = this.setAttachFileProperties(file); + if (map.get("saveType") != null) { + AttachFileSaveType saveType = (AttachFileSaveType) map.get("saveType"); + //如果是保存到数据库 + if (AttachFileSaveType.DATABASE.equals(saveType)) { + Session session = objectDao.getHibernateSession(); + Blob attachFileBlob = Hibernate.getLobCreator(session).createBlob(file.getBytes()); + attachFile.setAttachFileBinary(attachFileBlob); + } + //如果是保存到本地 + else if (AttachFileSaveType.LOCAL.equals(saveType)) { + Object filePath = map.get("filePath"); + if (filePath != null) { + attachFile.setAttachFilePath(filePath.toString()); + this.setPathByAttachType(attachFile); + try (InputStream fileStream = file.getInputStream()) { + //保存文件到本地 + FileUtils.saveLocalFile(fileStream, attachFile.getAttachFilePath(), attachFile.getUUIDFileName()); + //保存成功后将对应的地址放到list中 + fileSavePathLists.add(attachFile.getAttachFilePath() + attachFile.getUUIDFileName()); + } + } + } + } + String id = objectDao.saveAndReturnProperty(attachFile, "id"); + attachFiles = StringTools.uniteTwoStringBySemicolon(attachFiles, id, AttachFileInterface.ATTACHFILES_SEPARATOR); + } + map.put("fileSavePaths", fileSavePathLists); + // 将上传的附件ID关联到上传表单中去 + attachFileInterface.setAttachFiles(attachFiles); + } + catch (Exception e) { + logger.error(e, e); + throw new RuntimeException(e); + } + } - /** - * 根据request得到所有上传附件的输入字节流 - */ - @SuppressWarnings("unchecked") - public List getInputStreamFromAttachFile( - HttpServletRequest request) { - List imputStreamList = new ArrayList(); - if(request instanceof MultipartHttpServletRequest){ - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - Iterator it = multipartRequest.getFileNames(); - while (it.hasNext()) { - String key = (String) it.next(); - if (StringUtils.isBlank(key) - || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { - continue; - } - try { - MultipartFile file = multipartRequest.getFile(key); - - String name = file.getName(); - name = file.getOriginalFilename(); - if (file == null || file.isEmpty()) { - continue; - } - imputStreamList.add(file.getInputStream()); - } catch (IOException e) { - return null; - } - } - } - return imputStreamList; - } + @Override + public AttachFileType judgeAttachType(String type) { + AttachFileType attachFileType; + switch (type) { + case "mkv": + case "avi": + case "rmvb": + case "rm": + case "mpg": + case "mp4": + case "ogg": + case "flv": + case "mov": + case "wmv": + case "3gp": + attachFileType = AttachFileType.VIDEO; + break; + case "doc": + case "xls": + case "ppt": + case "docx": + case "xlsx": + case "pptx": + attachFileType = AttachFileType.OFFICE; + break; + default: + attachFileType = AttachFileType.OTHER; + break; + } + return attachFileType; - public AttachFile getById(String id) { - AttachFile attachFile = null; - if (StringUtils.isNotBlank(id)) { - attachFile = (AttachFile) objectDao.getByProperty(AttachFile.class - .getSimpleName(), "id", Long.valueOf(id)); - } - return attachFile; - } + } - public void creaseReferenceCountByIds(String ids, int number) { - if (StringUtils.isNotBlank(ids)) { - String sql = " where po.id in(" + ids + ") "; - List list = objectDao.findBySql(AttachFile.class.getSimpleName(), - sql); - for (Object o : list) { - AttachFile attachFile = (AttachFile) o; - attachFile.creaseReferenceCount(number); - objectDao.saveOrUpdate(attachFile); - } - } - } + @Override + public AttachFileType getAttachTypeById(String id) { + AttachFile attachFile = this.getById(id); + if (attachFile == null) { + throw new ParameterException("找不到对应的附件!"); + } + String attachType = attachFile.getAttachType(); + attachType = attachType.substring(1); + return this.judgeAttachType(attachType.toLowerCase()); + } - public void decreaseReferenceCountByIds(String ids, int number) { - if (StringUtils.isNotBlank(ids)) { - String sql = " where po.id in(" + ids + ") "; - List list = objectDao.findBySql(AttachFile.class.getSimpleName(), - sql); - if (list != null) { - for (Object o : list) { - AttachFile attachFile = (AttachFile) o; - attachFile.decreaseReferenceCount(number); - objectDao.saveOrUpdate(attachFile); - deleteAttachFileIfNoReference(attachFile); - } - } - } - } + /** + * 根据文件类型来设置放在不同的文件夹下 + * + * @param attachFile {@link AttachFile} + */ + private void setPathByAttachType(AttachFile attachFile) { + String attachFilePath = attachFile.getAttachFilePath(); + String attachType = attachFile.getAttachType(); + String needToJudgeType = attachType.substring(1); + AttachFileType attachFileType = this.judgeAttachType(needToJudgeType.toLowerCase()); + switch (attachFileType) { + case VIDEO: + //视频类型 + attachFile.setAttachFilePath(attachFilePath + AttachFileType.VIDEO.name() + "/"); + break; + case OFFICE: + //office文件 + attachFile.setAttachFilePath(attachFilePath + AttachFileType.OFFICE.name() + "/"); + break; + default: + //其他 + attachFile.setAttachFilePath(attachFilePath + AttachFileType.OTHER.name() + "/"); + break; + } + } - private void deleteAttachFileIfNoReference(AttachFile attachFile) { - if (0 >= attachFile.getReferenceCount().intValue()) { - objectDao.delete(attachFile); - } - } - - public boolean isInputStreamContainZipFile( - HttpServletRequest request){ - if(request instanceof MultipartHttpServletRequest){ - MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; - Iterator it = multipartRequest.getFileNames(); - while (it.hasNext()) { - String key = (String) it.next(); - if (StringUtils.isBlank(key) - || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { - continue; - } - MultipartFile file = multipartRequest.getFile(key); - String name = file.getOriginalFilename(); - if( name.endsWith(".zip") ) - { - return true; - } - } - } - return false; - } + /** + * 读取MultipartFile的属性来设置AttachFile对象 + * + * @param file {@link MultipartFile} + * @return + */ + private AttachFile setAttachFileProperties(MultipartFile file) { + AttachFile attachFile = new AttachFile(); + String originalFilename = file.getOriginalFilename(); + String GUIDFileName = this.setSaveFileGUIDName(originalFilename); + //设置文件的原来文件名 + attachFile.setFileName(originalFilename); + //设置文件根据guid后得到的文件名 + attachFile.setUUIDFileName(GUIDFileName); + attachFile.setContentType(file.getContentType()); + String attachType = originalFilename.substring(originalFilename.lastIndexOf(".")); + //设置文件的后缀 + attachFile.setAttachType(attachType); + return attachFile; + } + + /** + * 检验要上传附件的信息 + * + * @param key 从request拿到的文件名 + * @param file {@link MultipartFile} + * @return + */ + private boolean checkUpLoadMsg(String key, MultipartFile file) { + if (StringUtils.isBlank(key) || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { + return true; + } + if (file == null || file.isEmpty()) { + return true; + } + return false; + } + + + public void decreaseReferenceCountByIds(String ids, int number) { + if (StringUtils.isNotBlank(ids)) { + String sql = " where po.id in(" + ids + ") "; + List list = objectDao.findBySql(AttachFile.class.getSimpleName(), + sql); + if (list != null) { + for (Object o : list) { + AttachFile attachFile = (AttachFile) o; + attachFile.decreaseReferenceCount(number); + objectDao.saveOrUpdate(attachFile); + deleteAttachFileIfNoReference(attachFile); + } + } + } + } + + public boolean isInputStreamContainZipFile( + HttpServletRequest request) { + if (request instanceof MultipartHttpServletRequest) { + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Iterator it = multipartRequest.getFileNames(); + while (it.hasNext()) { + String key = (String) it.next(); + if (StringUtils.isBlank(key) + || !key.startsWith(AppKeys.Attach_File_Field_Prefix)) { + continue; + } + MultipartFile file = multipartRequest.getFile(key); + String name = file.getOriginalFilename(); + if (name.endsWith(".zip")) { + return true; + } + } + } + return false; + } + + private void deleteAttachFileIfNoReference(AttachFile attachFile) { + if (0 >= attachFile.getReferenceCount().intValue()) { + objectDao.delete(attachFile); + } + } + } Index: forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java =================================================================== diff -u -r15543 -r15795 --- forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java (.../KnowledgeFileManager.java) (revision 15543) +++ forgon-knowledge/src/main/java/com/forgon/knowledge/service/KnowledgeFileManager.java (.../KnowledgeFileManager.java) (revision 15795) @@ -4,20 +4,31 @@ import com.forgon.knowledge.model.KnowledgeFile; +import javax.servlet.http.HttpServletRequest; + /** * @author yuanbin * */ public interface KnowledgeFileManager { - public void submit(KnowledgeFile po); + void submit(KnowledgeFile po); - public KnowledgeFile getById(String moduleId, String id); + KnowledgeFile getById(String moduleId, String id); - public List findKnowledgeFileByFolderId(String moduleId, String id); + List findKnowledgeFileByFolderId(String moduleId, String id); - public void delete(KnowledgeFile po); + void delete(KnowledgeFile po); - public void deleteFileNodeByIds(String moduleId, List ids); + void deleteFileNodeByIds(String moduleId, List ids); - public void sortFile(String moduleId, String id, String orderType); + void sortFile(String moduleId, String id, String orderType); + + /** + * 处理文件上传 + * @param command {@link KnowledgeFile} + * @param moduleId + * @param request + */ + void handleUpLoadFile(KnowledgeFile command,String moduleId,HttpServletRequest request); + } Index: forgon-core/src/main/java/com/forgon/attachfile/tags/AttachFileTag.java =================================================================== diff -u -r12331 -r15795 --- forgon-core/src/main/java/com/forgon/attachfile/tags/AttachFileTag.java (.../AttachFileTag.java) (revision 12331) +++ forgon-core/src/main/java/com/forgon/attachfile/tags/AttachFileTag.java (.../AttachFileTag.java) (revision 15795) @@ -117,7 +117,8 @@ + AppKeys.Attach_File_Field_Prefix + "0\" id=\"" + AppKeys.Attach_File_Field_Prefix + "0\" class=\"file\" onchange=\"addFile(this)\" />"; - urlStr += "  提示:您能发送的附件总容量最大为50M
"; + urlStr += "  提示:上传视频推荐使用mp4格式
"; + // urlStr += "  提示:您能发送的附件总容量最大为50M
"; return urlStr; } Index: ssts-web/src/main/webapp/js/AttachFileType.js =================================================================== diff -u --- ssts-web/src/main/webapp/js/AttachFileType.js (revision 0) +++ ssts-web/src/main/webapp/js/AttachFileType.js (revision 15795) @@ -0,0 +1,22 @@ +//附件类型常量 +var AttachFileType = (function () { + var constants = { + VIDEO: 'video', + OFFICE: 'office', + OTHER: 'other' + } + var attachFileTypeObj = {}; + attachFileTypeObj.getConstant = function (name) { + return constants[name]; + } + attachFileTypeObj.getVideo = function () { + return constants.VIDEO; + } + attachFileTypeObj.getOffice = function () { + return constants.OFFICE; + } + attachFileTypeObj.getOther = function () { + return constants.OTHER; + } + return attachFileTypeObj; +})();