package com.moon.server.service.all; import com.moon.server.entity.all.StaticData; import com.moon.server.entity.data.DirEntity; import com.moon.server.entity.data.MetaFileEntity; import com.moon.server.entity.data.VerEntity; import com.moon.server.entity.sys.UserEntity; import com.moon.server.service.data.DirService; import com.moon.server.helper.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.lang.reflect.Field; import java.sql.Timestamp; import java.util.*; /** * 父上传服务 * @author WWW */ @Service public class BaseUploadService { @Autowired protected DirService dirService; @Autowired protected PathHelper pathHelper; public final Log log = LogFactory.getLog(getClass()); /** * 查询目录 */ public String selectPath() { return pathHelper.getTempPathName(); } /** * 上传文件 */ public List uploadData(T t, String path, boolean isGetGuid, HttpServletRequest req, HttpServletResponse res) throws Exception { StandardMultipartHttpServletRequest request = (StandardMultipartHttpServletRequest) req; req.setCharacterEncoding("utf-8"); res.setContentType("application/json;charset=utf-8"); if (t != null) { setEntity(t, request); } return getFiles(path, isGetGuid, request); } /** * 设置实体类 */ private void setEntity(T t, StandardMultipartHttpServletRequest req) { Enumeration enumeration = req.getParameterNames(); while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); try { Field field = t.getClass().getDeclaredField(key); field.setAccessible(true); String value = req.getParameter(key); switch (field.getType().toString()) { case "double": field.set(t, Double.valueOf(value)); break; case "long": field.set(t, Long.valueOf(value)); break; case "int": field.set(t, Integer.valueOf(value)); break; case "class java.sql.Timestamp": field.set(t, Timestamp.valueOf(value)); break; //case "class java.lang.String": default: field.set(t, value); break; } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } /** * 获取文件 */ public List getFiles(String subPath, boolean isGetGuid, StandardMultipartHttpServletRequest req) throws Exception { List list = new ArrayList<>(); String path = pathHelper.getTempPath(subPath); Iterator iterator = req.getFileNames(); while (iterator.hasNext()) { MultipartFile file = req.getFile(iterator.next()); if (null == file || StringHelper.isEmpty(file.getOriginalFilename())) { continue; } MetaFileEntity mf = new MetaFileEntity(); mf.setName(file.getOriginalFilename()); double sizes = FileHelper.sizeToMb(file.getSize()); mf.setSizes(sizes); mf.setPath(path + File.separator + mf.getName()); file.transferTo(new File(mf.getPath())); if (isGetGuid) { mf.setGuid(FileHelper.getFileMd5(mf.getPath())); } list.add(mf); } return list; } /** * 查询文件 */ public List selectFiles(String subPath) { String root = pathHelper.getConfig().getTempPath() + File.separator + subPath; File file = new File(root); if (!file.exists() && !file.isDirectory()) { return null; } File[] files = file.listFiles(); if (null == files || files.length == 0) { return null; } List list = new ArrayList<>(); for (File f : files) { String fileName = FileHelper.getFileName(f.getPath()); String extName = FileHelper.getExtension(fileName); if (!isExtValid(extName)) { continue; } MetaFileEntity mf = new MetaFileEntity(); mf.setName(fileName); mf.setExtName(extName); mf.setSizes(FileHelper.sizeToMb(f.length())); mf.setPath(subPath + File.separator + fileName); if (!StaticData.ZIP.equals(extName)) { mf.setGuid(FileHelper.getFileMd5(f.getPath())); } list.add(mf); } return list; } /** * 删除文件 */ public Integer deleteFiles(List list) { String root = pathHelper.getConfig().getTempPath(); int count = 0; for (MetaFileEntity entity : list) { if (!StringHelper.isEmpty(entity.getPath())) { String file = root + File.separator + entity.getPath(); File f = new File(file); if (f.exists()) { f.delete(); count++; } } } return count; } /** * 查询映射 */ public List selectMappers(UserEntity ue, String path, DirEntity dir, VerEntity ver, String epsgCode) { List metas = selectFiles(path); if (null == metas || metas.isEmpty()) { return null; } List list = new ArrayList<>(); List dirs = dirService.selectRecursiveById(dir.getId()); for (MetaFileEntity meta : metas) { meta.setEventid(StringHelper.getGuid()); meta.setDircode(dir.getCode()); meta.setDepcode(ue.getDepcode()); meta.setVerid(ver.getId()); meta.setCreateUser(ue.getId()); meta.setEpsgCode(epsgCode); if (StaticData.ZIP.equals(meta.getExtName())) { List subs = getMapperFiles(path, dir, dirs, meta); if (null != subs && subs.size() > 0) { list.addAll(subs); continue; } } list.add(meta); } setMetaType(list); return list; } /** * 获取映射文件 */ private List getMapperFiles(String path, DirEntity dir, List dirs, MetaFileEntity meta) { String tempPath = pathHelper.getConfig().getTempPath(); String zipFile = tempPath + File.separator + meta.getPath(); File file = new File(zipFile); if (!file.exists() || file.isDirectory()) { return null; } File zipFolder = new File(pathHelper.getConfig().getTempPath() + File.separator + path + "_zip"); if (!zipFolder.exists() || !zipFolder.isDirectory()) { zipFolder.mkdirs(); } // String subPath = zipFolder + File.separator + meta.getName().toLowerCase().replace(".zip", "") .replace("(","").replace(")","").replace(" ","") String subPath = zipFolder.getPath(); ZipHelper.unzip(zipFile, subPath); List files = new ArrayList<>(); getFilesByPath(files, subPath); return getMapperFiles(files, dir, dirs, meta, tempPath.length() + 1); } /** * 根据路径获取文件 */ private void getFilesByPath(List list, String path) { File file = new File(path); if (!file.isDirectory()) { String extName = FileHelper.getExtension(file); if (isExtValid(extName)) { list.add(file); } return; } if (isGdbFile(file)) { list.add(file); return; } File[] files = file.listFiles(); if (null == files) { return; } for (File f : files) { if (f.isDirectory()) { getFilesByPath(list, f.getPath()); } else { String extName = FileHelper.getExtension(f); if (isExtValid(extName)) { list.add(f); } } } } /** * 扩展是否有效 */ private boolean isExtValid(String extName) { return StaticData.ALL_EXTENSION.contains(extName) && !StaticData.MAPPER_EXCLUDE_EXT.contains(extName); } /** * 获取映射文件 */ private List getMapperFiles(List files, DirEntity dir, List dirs, MetaFileEntity meta, int start) { List list = new ArrayList<>(); for (File f : files) { boolean isGdb = isGdbFile(f); if (!isGdb && f.isDirectory()) { continue; } String fileName = FileHelper.getFileName(f.getPath()); String extName = FileHelper.getExtension(fileName); if (!isExtValid(extName) || fileName.startsWith("~")) { continue; } String dircode = getDirByPath(f.getPath(), fileName, dir, dirs); boolean isShp = StaticData.SHP.equals(extName); if (isGdb) { List rs = getGdbMappers(f, meta, dircode, start); if (null != rs && rs.size() > 0) { list.addAll(rs); } continue; } MetaFileEntity mf = createMetaFileEntity(meta); mf.setDircode(dircode); mf.setEventid(StringHelper.getGuid()); mf.setName(fileName); mf.setExtName(extName); mf.setPath(f.getPath().substring(start)); if (isShp) { List shpFiles = getShpFiles(f.getPath()); mf.setTab(fileName.replace(StaticData.SHP, "")); mf.setSizes(getFilesSize(shpFiles)); mf.setGuid(getFilesMd5(shpFiles)); } else { mf.setSizes(FileHelper.sizeToMb(f.length())); mf.setGuid(FileHelper.getFileMd5(f.getPath())); } list.add(mf); } return list; } /** * 创建元数据文件实体类 */ private MetaFileEntity createMetaFileEntity(MetaFileEntity meta) { MetaFileEntity mf = new MetaFileEntity(); mf.setDircode(meta.getDircode()); mf.setDepcode(meta.getDepcode()); mf.setVerid(meta.getVerid()); mf.setCreateUser(meta.getCreateUser()); mf.setEpsgCode(meta.getEpsgCode()); return mf; } /** * 根据文件路径获取目录ID */ private String getDirByPath(String filePath,String fileName, DirEntity dir, List dirs) { if (0 != dir.getPid() || null == dirs || dirs.isEmpty()) { return dir.getCode(); } if (StaticData.SLASH.equals(File.separator)) { filePath = filePath.replace("/", "\\"); } fileName = fileName.toLowerCase(); filePath = filePath.toLowerCase(); for (DirEntity entity : dirs) { if (filePath.contains(entity.getFullName().toLowerCase() + "\\" + fileName)) { return entity.getCode(); } } return dir.getCode(); } /** * 获取SHP文件集合 */ private List getShpFiles(String shpPath) { List list = new ArrayList<>(); list.add(shpPath); for (int i = 0, c = StaticData.SHP_EXT.size(); i < c; i++) { String path = shpPath.replace(".shp", StaticData.SHP_EXT.get(i)); File f = new File(path); if (f.exists() && !f.isDirectory()) { list.add(path); } } return list; } /** * 获取GDB文件集合 */ private List getGdbFiles(String path) { List list = new ArrayList<>(); File[] files = new File(path).listFiles(); if (null == files || files.length == 0) { return list; } for (File f : files) { list.add(f.getPath()); } return list; } /** * 获取多文件的MD5 */ private String getFilesMd5(List files) { List list = new ArrayList<>(); for (String file : files) { String md5 = FileHelper.getFileMd5(file); if (null != md5) { list.add(md5); } } if (list.size() > 0) { String str = StringHelper.join(list, ","); return FileHelper.getStringMd5(str); } return StringHelper.getGuid(); } /** * 获取多文件的大小 */ private double getFilesSize(List files) { long size = 0L; for (String file : files) { File f = new File(file); if (f.exists() && !f.isDirectory()) { size += f.length(); } } return FileHelper.sizeToMb(size); } /** * 获取GDB文件映射 */ private List getGdbMappers(File f, MetaFileEntity meta, String dircode, int start) { List tabs = GdbHelper.getTabNames(f.getPath()); if (null == tabs || tabs.size() == 0) { return null; } String fileName = FileHelper.getFileName(f.getPath()); String extName = FileHelper.getExtension(fileName); List gdbFiles = getGdbFiles(f.getPath()); String md5 = getFilesMd5(gdbFiles); double sizes = getFilesSize(gdbFiles); List list = new ArrayList<>(); for (String tab : tabs) { MetaFileEntity mf = createMetaFileEntity(meta); mf.setDircode(dircode); mf.setEventid(StringHelper.getGuid()); mf.setName(fileName); mf.setExtName(extName); mf.setSizes(FileHelper.sizeToMb(f.length())); mf.setPath(f.getPath().substring(start)); mf.setTab(tab); mf.setSizes(sizes); mf.setGuid(md5); list.add(mf); } return list; } /** * 是/否为GDB文件 */ private boolean isGdbFile(File f) { if (f.isDirectory() && f.getName().toLowerCase().endsWith(StaticData.GDB)) { File[] files = f.listFiles(); if (null == files || files.length == 0) { return false; } for (File file : files) { if ("gdb".equals(file.getName())) { return true; } } } return false; } /** * 设置元数据文件的类型 */ private void setMetaType(List list) { for (MetaFileEntity mf : list) { if (null != mf.getExtName()) { mf.setType(mf.getExtName().replace(".", "")); } } } /** * 处理目录 */ public void copePath(List list) { String basePath = pathHelper.getConfig().getTempPath() + File.separator; for (MetaFileEntity mf : list) { mf.setPath(mf.getPath().replace(basePath, "")); } } /** * 获取参数 * * Enumeration headers = req.getHeaderNames(); * Enumeration attributes = req.getAttributeNames(); */ public Map getParams(StandardMultipartHttpServletRequest req) { Map map = new HashMap<>(3); Enumeration enumeration = req.getParameterNames(); while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); String value = req.getParameter(key); map.put(key, value); } return map; } }