package com.moon.server.service.all; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moon.server.controller.all.BaseController; import com.moon.server.entity.all.*; import com.moon.server.entity.ctrl.KeyValueEntity; import com.moon.server.entity.data.DownloadEntity; import com.moon.server.entity.data.MetaEntity; import com.moon.server.entity.data.MetaFileEntity; import com.moon.server.entity.sys.AttachEntity; import com.moon.server.entity.sys.UserEntity; import com.moon.server.helper.*; import com.moon.server.mapper.all.BasicMapper; import com.moon.server.mapper.data.DownloadMapper; import com.moon.server.service.sys.AttachService; import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.FileHeader; import net.lingala.zip4j.model.ZipParameters; import org.apache.commons.io.FileUtils; 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 javax.servlet.http.HttpServletResponse; import java.io.File; import java.lang.reflect.Field; import java.util.*; @Service @SuppressWarnings("ALL") public class UploadAttachService { @Autowired PathHelper pathHelper; @Autowired AttachService attachService; @Autowired DownloadMapper downloadMapper; private static String tabs = "''"; public final static Map ATTACH_TABS = new HashMap<>(); private final static Log log = LogFactory.getLog(UploadAttachService.class); public static String getTabs() { return tabs; } public static void init(String cfg) { if (StringHelper.isEmpty(cfg)) { return; } String[] strs = cfg.split(StaticData.COMMA); if (strs.length == 0) { return; } List keys = new ArrayList<>(); for (String str : strs) { if (ATTACH_TABS.containsKey(str)) { continue; } ATTACH_TABS.put(str, str.contains("bd.") ? "materiname" : "photono"); keys.add("'" + str + "'"); } tabs = StringHelper.join(keys, ","); } public ResponseMsg upload(UserEntity ue, String tab, MultipartFile file, BaseController ctrl) { try { if (file == null && file.isEmpty()) { return ctrl.fail("文件上传为空", null); } if (file.getSize() > SettingData.MAX_FILE_SIZE) { return ctrl.fail(String.format("文件大于 %d MB", SettingData.MAX_FILE_SIZE / 1024 / 1024), null); } String oldName = file.getOriginalFilename(); String filePath = pathHelper.getTempPath() + File.separator + oldName; File newFile = new File(filePath); file.transferTo(newFile); double sizes = FileHelper.sizeToMb(file.getSize()); String md5 = FileHelper.getFileMd5(filePath); AttachEntity entity = attachService.selectByGuid(md5); if (entity != null) { newFile.delete(); return ctrl.success("文件已存在", md5); } AttachEntity ae = getAttachEntity(ue, tab, oldName, md5, sizes); String targetPath = pathHelper.getConfig().getUploadPath() + File.separator + ae.getPath(); newFile.renameTo(new File(targetPath)); int rows = attachService.insert(ae); return rows > 0 ? ctrl.success(md5) : ctrl.fail("保存文件失败", null); } catch (Exception ex) { return ctrl.fail(ex.getMessage(), null); } } protected AttachEntity getAttachEntity(UserEntity ue, String tab, String oldName, String md5, double sizes) { AttachEntity entity = new AttachEntity(); entity.setName(oldName); entity.setTab(tab); entity.setGuid(md5); String subPath = PathHelper.getUploadPath() + File.separator + md5 + FileHelper.getExtension(oldName); entity.setPath(subPath); entity.setSizes(sizes); if (ue != null) { entity.setCreateUser(ue.getId()); } return entity; } public void download(String guid, HttpServletResponse res) { download(guid, false, res); } public void download(String guid, boolean inline, HttpServletResponse res) { try { if (StringHelper.isEmpty(guid)) { WebHelper.writeStr2Page(res, StaticData.NO_FILE); return; } AttachEntity entity = attachService.selectByGuid(guid); if (entity == null) { WebHelper.writeStr2Page(res, StaticData.NO_FILE); return; } String filePath = pathHelper.getConfig().getUploadPath() + File.separator + entity.getPath(); File file = new File(filePath); if (!file.exists() || file.isDirectory()) { WebHelper.writeJson2Page(res, "文件不存在"); } WebHelper.download(filePath, entity.getName(), inline, res); } catch (Exception ex) { WebHelper.writeJson2Page(res, "文件下载出错"); log.error(ex.getMessage(), ex); } } public List uploadXlsAnnex(UserEntity ue, List ms, List list, String path) { List files = getAttachFiles(list, path); if (files.size() == 0) { return null; } List rs = new ArrayList<>(); for (MetaEntity meta : ms) { int rows = uploadXlsAnnex(ue, meta, files); rs.add(new KeyValueEntity(meta.getName(), String.valueOf(rows))); } return rs; } private List getAttachFiles(List list, String path) { List files = new ArrayList<>(); for (MetaFileEntity mf : list) { if (mf.getName().contains(StaticData.ZIP)) { List subs = getZipFiles(mf, path); if (null != subs && subs.size() > 0) { files.addAll(subs); } continue; } files.add(mf.getPath()); } return files; } private List getZipFiles(MetaFileEntity mf, String path) { File file = new File(mf.getPath()); 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 + mf.getName().toLowerCase().replace(".zip", ""); ZipHelper.unzip(mf.getPath(), subPath); List files = new ArrayList<>(); getFilesByPath(files, subPath); return files; } private void getFilesByPath(List list, String path) { File file = new File(path); if (!file.isDirectory()) { list.add(file.getPath()); return; } File[] files = file.listFiles(); if (null == files) { return; } for (File f : files) { if (f.isDirectory()) { getFilesByPath(list, f.getPath()); } else { list.add(f.getPath()); } } } private int uploadXlsAnnex(UserEntity ue, MetaEntity meta, List files) { List list = queryXlsData(meta); if (null == list || list.size() == 0) { return 0; } Field field = getAnnexField(list.get(0), meta.getTab()); String folder = meta.getName().split("\\.")[0].trim().toLowerCase() + File.separator; int rows = 0; for (Object obj : list) { String[] names = getNames(getAnnexName(obj, field)); if (null == names || names.length == 0) { continue; } for (String name : names) { String file = findAnnexFile(name, folder, files); if (null == file) { continue; } rows += insertXlsAnnex(ue, meta, (BaseEntity) obj, file); } } return rows; } public static String[] getNames(String str) { if (StringHelper.isEmpty(str)) { return null; } return str.replace(";", ",").replace(",", ",").split(","); } private List queryXlsData(MetaEntity meta) { String entity = meta.getTab().substring(meta.getTab().indexOf(".") + 1).replace("_", "").toLowerCase(); BasicMapper basicMapper = ClassHelper.getBasicMapper(entity); if (null == basicMapper) { return null; } QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("parentid", meta.getEventid()); List list = basicMapper.selectList(wrapper); if (null == list || list.size() == 0) { return null; } if (!(list.get(0) instanceof BaseEntity)) { return null; } return list; } public static Field getAnnexField(Object obj, String tab) { try { String str = ATTACH_TABS.get(tab); Field field = obj.getClass().getDeclaredField(str); field.setAccessible(true); return field; } catch (Exception ex) { return null; } } public static String getAnnexName(Object obj, Field field) { try { Object val = field.get(obj); return null == val ? null : val.toString().trim(); } catch (Exception ex) { return null; } } private String findAnnexFile(String name, String folder, List files) { name = File.separator + name.split("\\.")[0].trim().toLowerCase(); for (String file : files) { if (file.toLowerCase().contains(folder) && file.toLowerCase().contains(name)) { return file; } } for (String file : files) { if (file.toLowerCase().contains(name)) { return file; } } return null; } private int insertXlsAnnex(UserEntity ue, MetaEntity meta, BaseEntity be, String file) { File f = new File(file); if (!f.exists() || f.isDirectory()) { return 0; } String md5 = FileHelper.getFileMd5(file); AttachEntity old = attachService.selectByTabAndGuid(meta.getTab(), be.getEventid(), md5); if (null != old) { return 0; } String fileName = FileHelper.getFileName(file); double sizes = FileHelper.sizeToMb(f.length()); AttachEntity ae = getAttachEntity(ue, meta.getTab(), be.getEventid(), fileName, md5, sizes); String targetPath = pathHelper.getConfig().getUploadPath() + File.separator + ae.getPath(); try { FileUtils.copyFile(f, new File(targetPath)); } catch (Exception ex) { log.error(ex.getMessage(), ex); } return attachService.insert(ae); } protected AttachEntity getAttachEntity(UserEntity ue, String tabName, String eventid, String fileName, String md5, double sizes) { AttachEntity entity = new AttachEntity(); entity.setTab(tabName); entity.setTabGuid(eventid); entity.setName(fileName); entity.setGuid(md5); String subPath = PathHelper.getUploadPath() + File.separator + md5 + FileHelper.getExtension(fileName); entity.setPath(subPath); entity.setSizes(sizes); if (ue != null) { entity.setCreateUser(ue.getId()); } return entity; } public String downloadReqForGuids(UserEntity ue, List guids) { List list = attachService.selectByGuids(guids); return downloadReq(ue, list); } public String downloadReqForTabGuids(UserEntity ue, String tab, List guids) { List list = attachService.selectByTabGuids(tab, guids); return downloadReq(ue, list); } protected String downloadReq(UserEntity ue, List list) { if (null == list || list.isEmpty()) { return null; } String zipName = StringHelper.YMDHMS2_FORMAT.format(new Date()) + ".zip"; String zipFile = pathHelper.getDownloadFullPath() + File.separator + zipName; ZipFile zip = Zip4jHelper.createZipFile(zipFile, null); ZipParameters params = Zip4jHelper.getZipParams(false); addZipFiles(zip, params, list); DownloadEntity downloadEntity = getDownloadEntity(ue, zipFile, null); int rows = downloadMapper.insert(downloadEntity); return rows > 0 ? downloadEntity.getGuid() : null; } private void addZipFiles(ZipFile zip, ZipParameters params, List list) { int i = 1; String uploadPath = pathHelper.getConfig().getUploadPath(); for (AttachEntity ae : list) { try { String filePath = uploadPath + File.separator + ae.getPath(); File file = new File(filePath); if (!file.exists() || file.isDirectory()) { continue; } zip.addFile(file, params); FileHeader header = zip.getFileHeader(file.getName()); if (null != header) { zip.renameFile(header, i + "_" + ae.getName()); } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } private DownloadEntity getDownloadEntity(UserEntity ue, String file, String pwd) { DownloadEntity de = new DownloadEntity(); de.setName(FileHelper.getFileName(file)); // 1-Shp文件,2-专题图,3-元数据,4-业务数据,5-管道分析,6-统计报告,7-附件文件,8-瓦片文件 de.setType(7); de.setSizes(FileHelper.sizeToMb(new File(file).length())); de.setDepid(ue.getDepid()); de.setDcount(0); de.setPwd(pwd); de.setUrl(FileHelper.getRelativePath(file)); de.setDescr("附件文件"); de.setGuid(FileHelper.getFileMd5(file)); de.setCreateUser(ue.getId()); // de.setGeom(null) return de; } }