package org.jeecg.modules.desk.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.base.controller.JeecgController; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.CommonUtils; import org.jeecg.common.util.DateUtils; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.desk.entity.DeskFile; import org.jeecg.modules.desk.service.IDeskFileService; import org.jeecg.modules.desk.vo.DeskFileTree; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.AntPathMatcher; import org.springframework.util.FileCopyUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.HandlerMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; @Slf4j @Api(tags = "我的桌面") @RestController @RequestMapping("/desk/file") public class DeskFileController extends JeecgController { @Autowired private IDeskFileService deskFileService; @Value(value = "${jeecg.path.upload}") private String uploadpath; /** * 本地:local minio:minio 阿里:alioss */ @Value(value = "${jeecg.uploadType}") private String uploadType; private static int FOLDER_TYPE_2 = 2; //文件类型 1-文件 2-文件夹 private static String DESKTOP_FOLDER_TAG = "desk";//桌面文件标记 private static String DESKTOP_FOLDER_ALL_TAG = "all";//通用文件夹标记,所有人可查询此文件夹 //加载桌面文件夹 @RequestMapping(value = "/desktop", method = RequestMethod.GET) public Result> desktop(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "1000") Integer pageSize, HttpServletRequest req) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = sysUser.getUsername(); Result> result = new Result>(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap()); //查询类型为2的数据(1-文件 2-文件夹) queryWrapper.lambda().eq(DeskFile::getType, FOLDER_TYPE_2); //查询tag为desk的数据(desk-桌面文件夹标记) queryWrapper.lambda().and(i -> i.eq(DeskFile::getTag, DESKTOP_FOLDER_TAG)); //查询登录用户的数据 queryWrapper.lambda().and(i -> i.eq(DeskFile::getCreateBy, username).or().eq(DeskFile::getCreateBy,DESKTOP_FOLDER_ALL_TAG) ); //只查询未删除数据 queryWrapper.lambda().and(i -> i.isNull(true,DeskFile::getDel).or().eq(DeskFile::getDel,0)); Page page = new Page(pageNo, pageSize); IPage pageList = deskFileService.page(page, queryWrapper); result.setSuccess(true); result.setResult(pageList); return result; } //通用查询 @RequestMapping(value = "/list", method = RequestMethod.GET) public Result> queryPageList(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize, HttpServletRequest req) { Result> result = new Result>(); if (deskFile.getPid().isEmpty()) { return result.error500("上级目录不能为空!"); } LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = sysUser.getUsername(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap()); //查询登录用户的数据 queryWrapper.lambda().eq(DeskFile::getCreateBy, username); //只查询未删除数据 queryWrapper.lambda().isNull(true, DeskFile::getDel).or().eq(DeskFile::getDel, 0); Page page = new Page(pageNo, pageSize); IPage pageList = deskFileService.page(page, queryWrapper); //递归查询pid String pid = deskFile.getPid(); List> res = new ArrayList<>(); getParent(res, pid); result.setSuccess(true); result.setResult(pageList); result.setResultExt(res); return result; } //查询最近100条数据 @RequestMapping(value = "/recent", method = RequestMethod.GET) public Result> recent(DeskFile deskFile, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "100") Integer pageSize, HttpServletRequest req) { Result> result = new Result>(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = sysUser.getUsername(); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(deskFile, req.getParameterMap()); //查询登录用户的数据 queryWrapper.lambda().eq(DeskFile::getCreateBy, username); queryWrapper.lambda().eq(DeskFile::getType, 1); //只查询未删除数据 queryWrapper.lambda().isNull(true, DeskFile::getDel).or().eq(DeskFile::getDel, 0); Page page = new Page(pageNo, pageSize); IPage pageList = deskFileService.page(page, queryWrapper); result.setSuccess(true); result.setResult(pageList); return result; } private void getParent(List> res, String pid) { Map map = new HashMap<>(); DeskFile byId = deskFileService.getById(pid); if (byId != null) { map.put("id", byId.getId()); map.put("name", byId.getName()); res.add(map); getParent(res, byId.getPid()); } } @RequestMapping(value = "/add", method = RequestMethod.POST) @AutoLog(value = "添加文件") @Transactional public Result add(@RequestBody DeskFile deskFile, HttpServletRequest request) { Result result = new Result(); // 添加先查询是否有同名文件 TODO QueryWrapper queryWrapper = new QueryWrapper<>(); if (deskFile.getPid() != null) { queryWrapper.lambda().eq(DeskFile::getPid, deskFile.getPid()); } //添加桌面文件夹 if (deskFile.getTag() != null) { queryWrapper.lambda().eq(DeskFile::getTag, deskFile.getTag()); } queryWrapper.lambda().like(DeskFile::getName, deskFile.getName()); List list = deskFileService.list(queryWrapper); if (list != null && list.size() > 0) { // result.error500("文件名已存在"); // return result; deskFile.setName(deskFile.getName() + "(" + list.size() + ")"); } //特殊处理批量文件添加(添加文件) if (deskFile.getType() == 1) { String filelist = deskFile.getFileList(); if (filelist != null && !StringUtils.isEmpty(filelist)) { String[] split = filelist.split(","); for (int i = 0; i < split.length; i++) { String filePath = split[i]; DeskFile desk = new DeskFile(); desk.setFileName(filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length())); desk.setFilePath(filePath); desk.setPid(deskFile.getPid()); desk.setType(deskFile.getType()); desk.setFileType(filePath.substring(filePath.lastIndexOf(".") + 1)); //截取名称 String name = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.indexOf("_")); QueryWrapper wrapper = new QueryWrapper<>(); if (deskFile.getPid() != null) { wrapper.lambda().eq(DeskFile::getPid, desk.getPid()); } wrapper.lambda().like(DeskFile::getName, name); List res = deskFileService.list(wrapper); if (res != null && res.size() > 0) { //文件名重复 desk.setName(name + "(" + res.size() + ")"); } else { //文件名不重复 desk.setName(name); } desk.setUpdateTime(new Date()); deskFileService.save(desk); } } //(添加文件夹) } else if (deskFile.getType() == 2) { deskFile.setFileType("文件夹"); deskFile.setUpdateTime(new Date()); deskFileService.save(deskFile); } result.success("添加成功!"); result.setResult(deskFile); return result; } @RequestMapping(value = "/edit", method = RequestMethod.PUT) public Result edit(@RequestBody DeskFile deskFile) { Result result = new Result(); //先查询是否有同名文件 TODO QueryWrapper queryWrapper = new QueryWrapper<>(); if (deskFile.getPid() != null) { queryWrapper.lambda().eq(DeskFile::getPid, deskFile.getPid()); } queryWrapper.lambda().eq(DeskFile::getName, deskFile.getName()); queryWrapper.lambda().ne(DeskFile::getId, deskFile.getId()); List list = deskFileService.list(queryWrapper); if (list != null && list.size() > 0) { result.error500("文件名已存在"); return result; } deskFileService.updateById(deskFile); result.success("修改成功!"); result.setResult(deskFile); return result; } @RequestMapping(value = "/queryTreeList", method = RequestMethod.GET) public Result> queryTreeList(DeskFile deskFile) { Result> result = new Result>(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(DeskFile::getType, FOLDER_TYPE_2); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = sysUser.getUsername(); //查询登录用户的数据 queryWrapper.lambda().eq(DeskFile::getCreateBy, username); List list = deskFileService.list(queryWrapper); List trees = new ArrayList<>(); getTreeList(trees, list, null); //传入用户名为最上级目录 getTreePath(trees, null, username); result.setSuccess(true); result.setResult(trees); return result; } private void getTreeList(List treeList, List metaList, DeskFileTree temp) { for (DeskFile desk : metaList) { String tempPid = desk.getPid(); DeskFileTree tree = new DeskFileTree(desk); if (temp == null && oConvertUtils.isEmpty(tempPid)) { treeList.add(tree); getTreeList(treeList, metaList, tree); } else if (temp != null && tempPid != null && tempPid.equals(temp.getId())) { temp.getChildren().add(tree); getTreeList(treeList, metaList, tree); } } } //获取路径 public void getTreePath(List treeList, DeskFileTree temp, String userPath) { for (DeskFileTree desk : treeList) { String path = desk.getPath(); String pid = desk.getPid(); if (temp != null && temp.getPid() != null && pid.equals(temp.getId())) { path = temp.getPath() + '/' + path; } else { path = desk.getPath(); } //加入用户名为主路径 desk.setPath(userPath + "/" + path); if (desk.getChildren().size() < 1) { } else { getTreePath(desk.getChildren(), desk, userPath); } } } @AutoLog(value = "删除-虚拟桌面文件") @RequestMapping(value = "/delete", method = RequestMethod.DELETE) @Transactional public Result delete(@RequestParam(name = "id", required = true) String id) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String username = sysUser.getUsername(); DeskFile byId = deskFileService.getById(id); if(byId.getName().equals("最近上传") || byId.getName().equals(username)){ return Result.error("此文件夹不可删除"); } deskFileService.removeById(byId); //递归删除文件夹下文件 delSub(byId.getId()); return Result.ok("删除成功"); } public void delSub(String pid) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(DeskFile::getPid, pid); List list = deskFileService.list(queryWrapper); if (list.size() > 0) { deskFileService.remove(queryWrapper); for (int i = 0; i < list.size(); i++) { delSub(list.get(i).getId()); } } } /****上传部分start****/ //由于需要直接上传功能,需要新增一个自定义上传接口 @PostMapping(value = "/upload") public Result upload(HttpServletRequest request, HttpServletResponse response) { Result result = new Result<>(); String savePath = ""; String bizPath = request.getParameter("biz"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; MultipartFile file = multipartRequest.getFile("file");// 获取上传文件对象 //update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传 savePath = this.uploadLocal(file, bizPath); //update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传 if (oConvertUtils.isNotEmpty(savePath)) { result.setMessage(savePath); result.setSuccess(true); } else { result.setMessage("上传失败!"); result.setSuccess(false); } return result; } /** * 本地文件上传 * * @param mf 文件 * @param bizPath 自定义路径 * @return */ private String uploadLocal(MultipartFile mf, String bizPath) { try { String ctxPath = uploadpath; String fileName = null; File file = new File(ctxPath + File.separator + bizPath + File.separator); if (!file.exists()) { file.mkdirs();// 创建文件根目录 } String orgName = mf.getOriginalFilename();// 获取文件名 orgName = CommonUtils.getFileName(orgName); if (orgName.indexOf(".") != -1) { fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + DateUtils.date2Str(new SimpleDateFormat("yyyyMMddHHmmss")) + orgName.substring(orgName.lastIndexOf(".")); } else { fileName = orgName + "_" + System.currentTimeMillis(); } String savePath = file.getPath() + File.separator + fileName; File savefile = new File(savePath); FileCopyUtils.copy(mf.getBytes(), savefile); String dbpath = null; if (oConvertUtils.isNotEmpty(bizPath)) { dbpath = bizPath + File.separator + fileName; } else { dbpath = fileName; } if (dbpath.contains("\\")) { dbpath = dbpath.replace("\\", "/"); } return dbpath; } catch (IOException e) { log.error(e.getMessage(), e); } return ""; } /****上传部分end****/ @GetMapping(value = "/static/**") public void view(HttpServletRequest request, HttpServletResponse response) { // ISO-8859-1 ==> UTF-8 进行编码转换 String imgPath = extractPathFromPattern(request); if(oConvertUtils.isEmpty(imgPath) || imgPath=="null"){ return; } // 其余处理略 InputStream inputStream = null; OutputStream outputStream = null; try { imgPath = imgPath.replace("..", "").replace("../",""); if (imgPath.endsWith(",")) { imgPath = imgPath.substring(0, imgPath.length() - 1); } String filePath = uploadpath + File.separator + imgPath; File file = new File(filePath); if(!file.exists()){ response.setStatus(404); throw new RuntimeException("文件["+imgPath+"]不存在.."); } response.setContentType("application/force-download");// 设置强制下载不打开 response.addHeader("Content-Disposition", "attachment;fileName=" + new String(file.getName().getBytes("UTF-8"),"iso-8859-1")); inputStream = new BufferedInputStream(new FileInputStream(filePath)); outputStream = response.getOutputStream(); byte[] buf = new byte[1024]; int len; while ((len = inputStream.read(buf)) > 0) { outputStream.write(buf, 0, len); } response.flushBuffer(); } catch (IOException e) { log.error("预览文件失败" + e.getMessage()); response.setStatus(404); e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { log.error(e.getMessage(), e); } } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { log.error(e.getMessage(), e); } } } } /** * 把指定URL后的字符串全部截断当成参数 * 这么做是为了防止URL中包含中文或者特殊字符(/等)时,匹配不了的问题 * @param request * @return */ private static String extractPathFromPattern(final HttpServletRequest request) { String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path); } }