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.*; @Service @SuppressWarnings("ALL") 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, boolean hasMd5) { 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 (!isFileValid(f.getName())) { continue; } MetaFileEntity mf = new MetaFileEntity(); mf.setName(fileName); mf.setExtName(extName); mf.setSizes(FileHelper.sizeToMb(f.length())); mf.setPath(subPath + File.separator + fileName); if (hasMd5 && !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) { List metas = selectFiles(path, true); 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()); 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()) { if (isFileValid(file.getName())) { list.add(file); } return; } if (isGdbFile(file) || isOsgbFile(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 { if (isFileValid(f.getName())) { list.add(f); } } } } private boolean isFileValid(String fileName) { String extName = FileHelper.getExtension(fileName); if (fileName.startsWith(StaticData.TILDE) || !StaticData.ALL_EXTENSION.contains(extName)) { return false; } fileName = fileName.toLowerCase(); for (String ext : StaticData.MAPPER_EXCLUDE_EXT) { if (fileName.contains(ext)) { return false; } } return true; } 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); boolean isOsgb = isOsgbFile(f); boolean isFile = isGdb || isOsgb; if (f.isDirectory() && !isFile) { continue; } String fileName = FileHelper.getFileName(f.getPath()); String extName = isOsgb ? StaticData.OSGB : FileHelper.getExtension(fileName); if (!isFileValid(f.getName())) { continue; } String dircode = getDirByPath(f.getPath(), fileName, dir, dirs); if (isGdb) { List rs = getGdbMappers(f, meta, dircode, start); if (null != rs && rs.size() > 0) { list.addAll(rs); } continue; } if (isOsgb) { list.add(getOsgbMapper(f, meta, dircode, start)); continue; } MetaFileEntity mf = createMetaFileEntity(f, meta, fileName, extName); mf.setPath(f.getPath().substring(start)); mf.setDircode(dircode); list.add(mf); } return list; } private MetaFileEntity createMetaFileEntity(File f, MetaFileEntity meta, String fileName, String extName) { boolean isShp = StaticData.SHP.equals(extName); MetaFileEntity mf = createMetaFileEntity(meta); mf.setEventid(StringHelper.getGuid()); mf.setName(fileName); mf.setExtName(extName); 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())); } return mf; } 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; } 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(); } 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; } 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; } 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); } 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 + "\\" + tab); 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; } private boolean isGdbFile(File f) { if (f.isDirectory() && f.getName().toLowerCase().endsWith(StaticData.GDB)) { File gdb = new File(f.getPath() + File.separator + "gdb"); return gdb.exists() && !gdb.isDirectory(); } 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, "")); } } private boolean isOsgbFile(File f) { if (f.isDirectory()) { File meta = new File(f.getPath() + File.separator + "metadata.xml"); File data = new File(f.getPath() + File.separator + "Data"); return meta.exists() && !meta.isDirectory() && data.exists() && data.isDirectory(); } return false; } private MetaFileEntity getOsgbMapper(File f, MetaFileEntity meta, String dircode, int start) { String fileName = FileHelper.getFileName(f.getPath()); List files = new ArrayList<>(); FileHelper.getFilesByPath(files, f.getPath()); String md5 = getFilesMd5(files); double sizes = getFilesSize(files); MetaFileEntity mf = createMetaFileEntity(meta); mf.setDircode(dircode); mf.setEventid(StringHelper.getGuid()); mf.setName(fileName); mf.setExtName(StaticData.OSGB); mf.setSizes(FileHelper.sizeToMb(f.length())); mf.setPath(f.getPath().substring(start)); mf.setSizes(sizes); mf.setGuid(md5); return mf; } 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; } }