content: package org.jeecg.modules.system.controller;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONObject;
  import lombok.extern.slf4j.Slf4j;
  import org.jeecg.common.api.vo.Result;
  import org.jeecg.common.constant.CommonConstant;
  import org.jeecg.common.system.api.ISysBaseAPI;
  import org.jeecg.common.util.CommonUtils;
  import org.jeecg.common.util.RestUtil;
  import org.jeecg.common.util.TokenUtils;
  import org.jeecg.common.util.oConvertUtils;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.beans.factory.annotation.Value;
  import org.springframework.http.HttpHeaders;
  import org.springframework.http.HttpMethod;
  import org.springframework.http.ResponseEntity;
  import org.springframework.http.server.ServletServerHttpRequest;
  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 org.springframework.web.servlet.ModelAndView;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.*;
  import java.net.URLDecoder;
  /**
   * <p>
   * 用户表 前端控制器
   * </p>
   *
   * @Author scott
   * @since 2018-12-20
   */
  @Slf4j
  @RestController
  @RequestMapping("/sys/common")
  public class CommonController {
  
      @Autowired
      private ISysBaseAPI sysBaseAPI;
  
      @Value(value = "${jeecg.path.upload}")
      private String uploadpath;
  
      /**
       * 本地：local minio：minio 阿里：alioss
       */
      @Value(value="${jeecg.uploadType}")
      private String uploadType;
  
      /**
       * @Author 政辉
       * @return
       */
      @GetMapping("/403")
      public Result<?> noauth()  {
          return Result.error("没有权限，请联系管理员授权");
      }
  
      /**
       * 文件上传统一方法
       * @param request
       * @param response
       * @return
       */
      @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");// 获取上传文件对象
          if(oConvertUtils.isEmpty(bizPath)){
              if(CommonConstant.UPLOAD_TYPE_OSS.equals(uploadType)){
                  //未指定目录，则用阿里云默认目录 upload
                  bizPath = "upload";
                  //result.setMessage("使用阿里云文件上传时，必须添加目录！");
                  //result.setSuccess(false);
                  //return result;
              }else{
                  bizPath = "";
              }
          }
          if(CommonConstant.UPLOAD_TYPE_LOCAL.equals(uploadType)){
              //update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传
              savePath = this.uploadLocal(file,bizPath);
              //update-begin-author:lvdandan date:20200928 for:修改JEditor编辑器本地上传
              /**  富文本编辑器及markdown本地上传时，采用返回链接方式
              //针对jeditor编辑器如何使 lcaol模式，采用 base64格式存储
              String jeditor = request.getParameter("jeditor");
              if(oConvertUtils.isNotEmpty(jeditor)){
                  result.setMessage(CommonConstant.UPLOAD_TYPE_LOCAL);
                  result.setSuccess(true);
                  return result;
              }else{
                  savePath = this.uploadLocal(file,bizPath);
              }
              */
          }else{
              //update-begin-author:taoyan date:20200814 for:文件上传改造
              savePath = CommonUtils.upload(file, bizPath, uploadType);
              //update-end-author:taoyan date:20200814 for:文件上传改造
          }
          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(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
              }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 "";
      }
  
  //	@PostMapping(value = "/upload2")
  //	public Result<?> upload2(HttpServletRequest request, HttpServletResponse response) {
  //		Result<?> result = new Result<>();
  //		try {
  //			String ctxPath = uploadpath;
  //			String fileName = null;
  //			String bizPath = "files";
  //			String tempBizPath = request.getParameter("biz");
  //			if(oConvertUtils.isNotEmpty(tempBizPath)){
  //				bizPath = tempBizPath;
  //			}
  //			String nowday = new SimpleDateFormat("yyyyMMdd").format(new Date());
  //			File file = new File(ctxPath + File.separator + bizPath + File.separator + nowday);
  //			if (!file.exists()) {
  //				file.mkdirs();// 创建文件根目录
  //			}
  //			MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  //			MultipartFile mf = multipartRequest.getFile("file");// 获取上传文件对象
  //			String orgName = mf.getOriginalFilename();// 获取文件名
  //			fileName = orgName.substring(0, orgName.lastIndexOf(".")) + "_" + System.currentTimeMillis() + orgName.substring(orgName.indexOf("."));
  //			String savePath = file.getPath() + File.separator + fileName;
  //			File savefile = new File(savePath);
  //			FileCopyUtils.copy(mf.getBytes(), savefile);
  //			String dbpath = bizPath + File.separator + nowday + File.separator + fileName;
  //			if (dbpath.contains("\\")) {
  //				dbpath = dbpath.replace("\\", "/");
  //			}
  //			result.setMessage(dbpath);
  //			result.setSuccess(true);
  //		} catch (IOException e) {
  //			result.setSuccess(false);
  //			result.setMessage(e.getMessage());
  //			log.error(e.getMessage(), e);
  //		}
  //		return result;
  //	}
  
      /**
       * 预览图片&下载文件
       * 请求地址：http://localhost:8080/common/static/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
       *
       * @param request
       * @param response
       */
      @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("..", "");
              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);
                  }
              }
          }
  
      }
  
  //	/**
  //	 * 下载文件
  //	 * 请求地址：http://localhost:8080/common/download/{user/20190119/e1fe9925bc315c60addea1b98eb1cb1349547719_1547866868179.jpg}
  //	 *
  //	 * @param request
  //	 * @param response
  //	 * @throws Exception
  //	 */
  //	@GetMapping(value = "/download/**")
  //	public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
  //		// ISO-8859-1 ==> UTF-8 进行编码转换
  //		String filePath = extractPathFromPattern(request);
  //		// 其余处理略
  //		InputStream inputStream = null;
  //		OutputStream outputStream = null;
  //		try {
  //			filePath = filePath.replace("..", "");
  //			if (filePath.endsWith(",")) {
  //				filePath = filePath.substring(0, filePath.length() - 1);
  //			}
  //			String localPath = uploadpath;
  //			String downloadFilePath = localPath + File.separator + filePath;
  //			File file = new File(downloadFilePath);
  //	         if (file.exists()) {
  //	         	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(file));
  //	 			outputStream = response.getOutputStream();
  //	 			byte[] buf = new byte[1024];
  //	 			int len;
  //	 			while ((len = inputStream.read(buf)) > 0) {
  //	 				outputStream.write(buf, 0, len);
  //	 			}
  //	 			response.flushBuffer();
  //	         }
  //
  //		} catch (Exception e) {
  //			log.info("文件下载失败" + e.getMessage());
  //			// e.printStackTrace();
  //		} finally {
  //			if (inputStream != null) {
  //				try {
  //					inputStream.close();
  //				} catch (IOException e) {
  //					e.printStackTrace();
  //				}
  //			}
  //			if (outputStream != null) {
  //				try {
  //					outputStream.close();
  //				} catch (IOException e) {
  //					e.printStackTrace();
  //				}
  //			}
  //		}
  //
  //	}
  
      /**
       * @功能：pdf预览Iframe
       * @param modelAndView
       * @return
       */
      @RequestMapping("/pdf/pdfPreviewIframe")
      public ModelAndView pdfPreviewIframe(ModelAndView modelAndView) {
          modelAndView.setViewName("pdfPreviewIframe");
          return modelAndView;
      }
  
      /**
       *  把指定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);
      }
  
      /**
       * 中转HTTP请求，解决跨域问题
       *
       * @param url 必填：请求地址
       * @return
       */
      @RequestMapping("/transitRESTful")
      public Result transitRESTful(@RequestParam("url") String url, HttpServletRequest request) {
          try {
              ServletServerHttpRequest httpRequest = new ServletServerHttpRequest(request);
              // 中转请求method、body
              HttpMethod method = httpRequest.getMethod();
              JSONObject params;
              try {
                  params = JSON.parseObject(JSON.toJSONString(httpRequest.getBody()));
              } catch (Exception e) {
                  params = new JSONObject();
              }
              // 中转请求问号参数
              JSONObject variables = JSON.parseObject(JSON.toJSONString(request.getParameterMap()));
              variables.remove("url");
              // 在 headers 里传递Token
              String token = TokenUtils.getTokenByRequest(request);
              HttpHeaders headers = new HttpHeaders();
              headers.set("X-Access-Token", token);
              // 发送请求
              String httpURL = URLDecoder.decode(url, "UTF-8");
              ResponseEntity<String> response = RestUtil.request(httpURL, method, headers , variables, params, String.class);
              // 封装返回结果
              Result<Object> result = new Result<>();
              int statusCode = response.getStatusCodeValue();
              result.setCode(statusCode);
              result.setSuccess(statusCode == 200);
              String responseBody = response.getBody();
              try {
                  // 尝试将返回结果转为JSON
                  Object json = JSON.parse(responseBody);
                  result.setResult(json);
              } catch (Exception e) {
                  // 转成JSON失败，直接返回原始数据
                  result.setResult(responseBody);
              }
              return result;
          } catch (Exception e) {
              log.debug("中转HTTP请求失败", e);
              return Result.error(e.getMessage());
          }
      }
  
  }
  