许鹏程
2024-05-28 927359fdce884acdcd76b90008eb0303f4bdd29d
src/main/java/com/product/file/util/FileUtils.java
@@ -33,592 +33,585 @@
 */
@Component
public class FileUtils {
    @Autowired
    BaseDao baseDao;
   @Autowired
   BaseDao baseDao;
    /**
     * 文件是否存在
     *
     * @param dir
     * @param fileName
     * @return
     */
    public boolean fileIsExist(String dir, String fileName) {
        return fileIsExist(true, dir, fileName);
    }
   /**
    * 文件是否存在
    *
    * @param dir
    * @param fileName
    * @return
    */
   public boolean fileIsExist(String dir, String fileName) {
      return fileIsExist(true, dir, fileName);
   }
    /**
     * 删除文件服务器上的文件
     *
     * @param dir
     * @param fileName
     * @return
     */
    public boolean deleteFilesServerOnFile(String dir, String fileName) {
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        if (currentUser == null || StringUtils.isEmpty(currentUser.getToken_info())) {
            return false;
        }
        return FTPService.needUpload2FileServer() && new FTPService().deleteFile(dir, fileName);
    }
   /**
    * 删除文件服务器上的文件
    *
    * @param dir
    * @param fileName
    * @return
    */
   public boolean deleteFilesServerOnFile(String dir, String fileName) {
      SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
      if (currentUser == null || StringUtils.isEmpty(currentUser.getToken_info())) {
         return false;
      }
      return FTPService.needUpload2FileServer() && new FTPService().deleteFile(dir, fileName);
   }
    /**
     * 文件是否存在
     *
     * @param isServer 是否文件服务器
     * @param dir
     * @param fileName
     * @return
     */
    public boolean fileIsExist(boolean isServer, String dir, String fileName) {
        if (isServer && FTPService.needUpload2FileServer()) {
            FTPService ftpService = new FTPService();
            return ftpService.fileIsExist(dir, fileName);
        } else {
            return new File(Global.getSystemConfig("local.dir", "") + "/" + dir + "/" + fileName).isFile();
        }
    }
   /**
    * 文件是否存在
    *
    * @param isServer 是否文件服务器
    * @param dir
    * @param fileName
    * @return
    */
   public boolean fileIsExist(boolean isServer, String dir, String fileName) {
      if (isServer && FTPService.needUpload2FileServer()) {
         FTPService ftpService = new FTPService();
         return ftpService.fileIsExist(dir, fileName);
      } else {
         return new File(Global.getSystemConfig("local.dir", "") + "/" + dir + "/" + fileName).isFile();
      }
   }
    /**
     * 根据文件记录表uuid 获取文件的字节
     *
     * @param uuid
     * @return
     * @throws BaseException
     */
    public byte[] getFileByte(String uuid) throws BaseException {
        File file = getFile(uuid, false);
        if (file == null || !file.isFile()) {
            return null;
        }
        byte[] bytes = cn.hutool.core.io.FileUtil.readBytes(file);
        file.delete();
        return bytes;
    }
   /**
    * 根据文件记录表uuid 获取文件的字节
    *
    * @param uuid
    * @return
    * @throws BaseException
    */
   public byte[] getFileByte(String uuid) throws BaseException {
      File file = getFile(uuid, false);
      if (file == null || !file.isFile()) {
         return null;
      }
      byte[] bytes = cn.hutool.core.io.FileUtil.readBytes(file);
      file.delete();
      return bytes;
   }
    /**
     * 获取文件  (文件使用完后请立即删除避免占用服务器磁盘空间)
     *
     * @param isUploadServer 是否上传在文件服务器
     * @param dir            存储路径一般为 附件表 attachment_url 字段(不含服务器文件存储文件夹)
     * @param fileName       文件名称
     * @param isEncrypt      是否加密文件
     * @return 返回文件 当开启FTP时 第一次尝试在文件服务器上获取文件 获取不到再到应用部署服务器对应路径获取文件
     * @throws BaseException 找不到文件抛出文件路径错误
     */
    public File getFile(boolean isUploadServer, String dir, String fileName, boolean isEncrypt) throws BaseException {
        if (StringUtils.isAnyEmpty(dir, fileName)) {
            return null;
        }
        String path = dir + File.separator + fileName;
        String random = RandomUtil.randomString(5);
        if (isUploadServer && FTPService.needUpload2FileServer()) {
            if (!fileIsExist(dir, fileName)) {
                return null;
            }
            File file = new File(Global.getSystemConfig("temp.dir", "") + "/" + "temp_down_file_" + fileName + "_" + random);
            if (file.isFile()) {
                file.delete();
            }
            try {
                file.getParentFile().mkdirs();
                file.createNewFile();
                OutputStream out = new FileOutputStream(file);
                FTPService ftpService = new FTPService();
                if (ftpService.downloadFile(path, out)) {
                    if (isEncrypt) {
                        String encryptPath = file.getParent() + "/" + "decode_file_temp_" + fileName + "_" + random;
                        out.flush();
                        out.close();
                        FileUtil.copyFile(file, encryptPath, -1);
                        file.delete();
                        file = new File(encryptPath);
                    } else {
                        out.flush();
                        out.close();
                    }
                    if (file.isFile()) {
                        return file;
                    }
                } else {
                    if (file.exists()) {
                        file.delete();
                    }
                }
            } catch (Exception e) {
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (StringUtils.isEmpty(e.getMessage()) ? "" : "," + e.getMessage()));
            }
        }
        //本地服务器获取文件
        File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
        if (file.isFile()) {
            file = FileUtil.copyFile(file, Global.getSystemConfig("temp.dir", "") + File.separator + "download_file_temp_" + RandomUtil.randomString(5) + "_" + file.getName(), isEncrypt ? -1 : 0);
        }
        if (file.isFile()) {
            return file;
        }
        throw new BaseException(FileCode.INVALID_FILE_PATH);
    }
   /**
    * 获取文件  (文件使用完后请立即删除避免占用服务器磁盘空间)
    *
    * @param isUploadServer 是否上传在文件服务器
    * @param dir            存储路径一般为 附件表 attachment_url 字段(不含服务器文件存储文件夹)
    * @param fileName       文件名称
    * @param isEncrypt      是否加密文件
    * @return 返回文件 当开启FTP时 第一次尝试在文件服务器上获取文件 获取不到再到应用部署服务器对应路径获取文件
    * @throws BaseException 找不到文件抛出文件路径错误
    */
   public File getFile(boolean isUploadServer, String dir, String fileName, boolean isEncrypt) throws BaseException {
      if (StringUtils.isAnyEmpty(dir, fileName)) {
         return null;
      }
      String path = dir + File.separator + fileName;
      String random = RandomUtil.randomString(5);
      if (isUploadServer && FTPService.needUpload2FileServer()) {
         if (!fileIsExist(dir, fileName)) {
            return null;
         }
         File file = new File(Global.getSystemConfig("temp.dir", "") + "/" + "temp_down_file_" + fileName + "_" + random);
         if (file.isFile()) {
            file.delete();
         }
         try {
            file.getParentFile().mkdirs();
            file.createNewFile();
            OutputStream out = new FileOutputStream(file);
            FTPService ftpService = new FTPService();
            if (ftpService.downloadFile(path, out)) {
               if (isEncrypt) {
                  String encryptPath = file.getParent() + "/" + "decode_file_temp_" + fileName + "_" + random;
                  out.flush();
                  out.close();
                  FileUtil.copyFile(file, encryptPath, -1);
                  file.delete();
                  file = new File(encryptPath);
               } else {
                  out.flush();
                  out.close();
               }
               if (file.isFile()) {
                  return file;
               }
            } else {
               if (file.exists()) {
                  file.delete();
               }
            }
         } catch (Exception e) {
            throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (StringUtils.isEmpty(e.getMessage()) ? "" : "," + e.getMessage()));
         }
      }
      //本地服务器获取文件
      File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
      if (file.isFile()) {
         file = FileUtil.copyFile(file, Global.getSystemConfig("temp.dir", "") + File.separator + "download_file_temp_" + RandomUtil.randomString(5) + "_" + file.getName(), isEncrypt ? -1 : 0);
      }
      if (file.isFile()) {
         return file;
      }
      throw new BaseException(FileCode.INVALID_FILE_PATH);
   }
    /**
     * 根据文件记录表uuid 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
     *
     * @param uuid
     * @return
     * @throws BaseException
     */
    public File getFile(String uuid) throws BaseException {
        return getFile(uuid, false);
    }
   /**
    * 根据文件记录表uuid 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
    *
    * @param uuid
    * @return
    * @throws BaseException
    */
   public File getFile(String uuid) throws BaseException {
      return getFile(uuid, false);
   }
    /**
     * 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
     * 传入参数可参考  public File getFile(String uuid, boolean onlineViewFile) throws BaseException
     *
     * @param dir            文件存储文件夹 (attachment_url)
     * @param fileName       文件名称(attachment_title)
     * @param onlineViewFile 是否在线预览
     * @param uploadSign     文件是否上传在文件服务器
     * @return
     * @throws BaseException 找不到文件会抛出错误
     */
    public File getFile(String dir, String fileName, boolean onlineViewFile, boolean uploadSign) throws BaseException {
        String path = dir + File.separator +
                (onlineViewFile ? CmnConst.TRANSFER_DIR_NAME : "") +
                File.separator + fileName;
        if (uploadSign) {
            //服务器上获取文件
            FTPService ftpService = new FTPService();
            File file = new File(Global.getSystemConfig("temp.dir", "") + "/" + "temp_down_file_" + fileName + "_" + RandomUtil.randomString(5));
            if (file.isFile()) {
                file.delete();
            }
            try {
                file.getParentFile().mkdirs();
                file.createNewFile();
                OutputStream out = new FileOutputStream(file);
                if (ftpService.downloadFile(path, out)) {
                    out.flush();
                    out.close();
                    return file;
                } else {
                    out.flush();
                    out.close();
                    if (file.exists()) {
                        file.delete();
                    }
                }
                throw new BaseException(FileCode.GET_FILE_FAIL);
            } catch (Exception e) {
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (StringUtils.isEmpty(e.getMessage()) ? "" : "," + e.getMessage()));
            }
        } else {
            //本地服务器获取文件
            File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
            if (file.isFile()) {
                File tempFile = new File(Global.getSystemConfig("temp.dir", "") + File.separator + "download_file_temp_" + RandomUtil.randomString(5) + "_" + file.getName());
                FileUtil.copyFile(file, tempFile.getPath());
                return tempFile;
            } else {
                throw new BaseException(FileCode.GET_FILE_FAIL);
            }
        }
    }
   /**
    * 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
    * 传入参数可参考  public File getFile(String uuid, boolean onlineViewFile) throws BaseException
    *
    * @param dir            文件存储文件夹 (attachment_url)
    * @param fileName       文件名称(attachment_title)
    * @param onlineViewFile 是否在线预览
    * @param uploadSign     文件是否上传在文件服务器
    * @return
    * @throws BaseException 找不到文件会抛出错误
    */
   public File getFile(String dir, String fileName, boolean onlineViewFile, boolean uploadSign) throws BaseException {
      String path = dir + File.separator +
            (onlineViewFile ? CmnConst.TRANSFER_DIR_NAME : "") +
            File.separator + fileName;
      if (uploadSign) {
         //服务器上获取文件
         FTPService ftpService = new FTPService();
         File file = new File(Global.getSystemConfig("temp.dir", "") + "/" + "temp_down_file_" + fileName + "_" + RandomUtil.randomString(5));
         if (file.isFile()) {
            file.delete();
         }
         try {
            file.getParentFile().mkdirs();
            file.createNewFile();
            OutputStream out = new FileOutputStream(file);
            if (ftpService.downloadFile(path, out)) {
               out.flush();
               out.close();
               return file;
            } else {
               out.flush();
               out.close();
               if (file.exists()) {
                  file.delete();
               }
            }
            throw new BaseException(FileCode.GET_FILE_FAIL);
         } catch (Exception e) {
            throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (StringUtils.isEmpty(e.getMessage()) ? "" : "," + e.getMessage()));
         }
      } else {
         //本地服务器获取文件
         File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
         if (file.isFile()) {
            File tempFile = new File(Global.getSystemConfig("temp.dir", "") + File.separator + "download_file_temp_" + RandomUtil.randomString(5) + "_" + file.getName());
            FileUtil.copyFile(file, tempFile.getPath());
            return tempFile;
         } else {
            throw new BaseException(FileCode.GET_FILE_FAIL);
         }
      }
   }
    /**
     * 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
     *
     * @param uuid           文件记录表uuid
     * @param onlineViewFile 是否在线预览
     * @return
     * @throws BaseException
     */
    public File getFile(String uuid, boolean onlineViewFile) throws BaseException {
        FieldSetEntity fse = getFileRecord(uuid);
        return getFile(fse.getString(CmnConst.ATTACHMENT_URL), fse.getString(CmnConst.ATTACHMENT_TITLE), onlineViewFile, fse.getBoolean(CmnConst.UPLOAD_SIGN));
    }
   /**
    * 获取文件 (文件使用完后请立即删除避免占用服务器磁盘空间)
    *
    * @param uuid           文件记录表uuid
    * @param onlineViewFile 是否在线预览
    * @return
    * @throws BaseException
    */
   public File getFile(String uuid, boolean onlineViewFile) throws BaseException {
      FieldSetEntity fse = getFileRecord(uuid);
      return getFile(fse.getString(CmnConst.ATTACHMENT_URL), fse.getString(CmnConst.ATTACHMENT_TITLE), onlineViewFile, fse.getBoolean(CmnConst.UPLOAD_SIGN));
   }
    /**
     * 获取文件记录
     *
     * @param uuid
     * @return
     * @throws BaseException
     */
    public FieldSetEntity getFileRecord(String uuid) throws BaseException {
        FieldSetEntity fse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
        if (fse == null || StringUtils.isEmpty(fse.getUUID())) {
            throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
        }
        return fse;
    }
   /**
    * 获取文件记录
    *
    * @param uuid
    * @return
    * @throws BaseException
    */
   public FieldSetEntity getFileRecord(String uuid) throws BaseException {
      FieldSetEntity fse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_ATTACHMENTS, uuid, false);
      if (fse == null || StringUtils.isEmpty(fse.getUUID())) {
         throw new BaseException(FileCode.GET_FILE_RECORD_FAIL);
      }
      return fse;
   }
    /**
     * 输出文件流
     *
     * @param uuid       文件记录uuid
     * @param onlineView 在线预览
     * @param response
     * @throws Exception
     */
    public void getFile(String uuid, boolean onlineView, HttpServletResponse response) throws Exception {
        FieldSetEntity fse = getFileRecord(uuid);
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        String userAgent = request.getHeader("User-Agent");
        String file_name = fse.getString("file_name");
        if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
            file_name = java.net.URLEncoder.encode(file_name, "UTF-8");
        } else {
            // 非IE浏览器的处理:
            file_name = new String(file_name.getBytes("UTF-8"), "ISO-8859-1");
        }
        response.setContentType("multipart/form-data");
        response.setHeader("Content-disposition",
                String.format("attachment; filename=\"%s\"", file_name));
        String path = fse.getString(CmnConst.ATTACHMENT_URL) + File.separator +
                (onlineView && fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN) ? CmnConst.TRANSFER_DIR_NAME : "") +
                File.separator + fse.getString(CmnConst.ATTACHMENT_TITLE);
        if (fse.getBoolean(CmnConst.UPLOAD_SIGN)) {
            //服务器上获取文件
            FTPService ftpService = new FTPService();
            ftpService.downloadFile(path, response.getOutputStream());
        } else {
            //本地服务器获取文件
            File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
            if (file.isFile()) {
                IoUtil.write(response.getOutputStream(), true, cn.hutool.core.io.FileUtil.readBytes(file));
            } else {
                throw new BaseException(FileCode.GET_FILE_FAIL);
            }
        }
    }
   /**
    * 输出文件流
    *
    * @param uuid       文件记录uuid
    * @param onlineView 在线预览
    * @param response
    * @throws Exception
    */
   public void getFile(String uuid, boolean onlineView, HttpServletResponse response) throws Exception {
      FieldSetEntity fse = getFileRecord(uuid);
      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
      String userAgent = request.getHeader("User-Agent");
      String file_name = fse.getString("file_name");
      if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
         file_name = java.net.URLEncoder.encode(file_name, "UTF-8");
      } else {
         // 非IE浏览器的处理:
         file_name = new String(file_name.getBytes("UTF-8"), "ISO-8859-1");
      }
      response.setContentType("multipart/form-data");
      response.setHeader("Content-disposition",
            String.format("attachment; filename=\"%s\"", file_name));
      String path = fse.getString(CmnConst.ATTACHMENT_URL) + File.separator +
            (onlineView && fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN) ? CmnConst.TRANSFER_DIR_NAME : "") +
            File.separator + fse.getString(CmnConst.ATTACHMENT_TITLE);
      if (fse.getBoolean(CmnConst.UPLOAD_SIGN)) {
         //服务器上获取文件
         FTPService ftpService = new FTPService();
         ftpService.downloadFile(path, response.getOutputStream());
      } else {
         //本地服务器获取文件
         File file = new File(Global.getSystemConfig("local.dir", "") + File.separator + path);
         if (file.isFile()) {
            IoUtil.write(response.getOutputStream(), true, cn.hutool.core.io.FileUtil.readBytes(file));
         } else {
            throw new BaseException(FileCode.GET_FILE_FAIL);
         }
      }
   }
    /**
     * 上传文件
     * 删除传入的文件
     *
     * @param filePath 文件路径
     * @return 返回上传后的文件名称
     */
    public static String uploadFile(String filePath) throws BaseException {
        return uploadFile(new File(filePath), null, true);
    }
   /**
    * 上传文件
    * 删除传入的文件
    *
    * @param filePath 文件路径
    * @return 返回上传后的文件名称
    */
   public static String uploadFile(String filePath) throws BaseException {
      return uploadFile(new File(filePath), null, true);
   }
    /**
     * 上传文件
     * 删除传入的文件
     *
     * @param file 文件
     * @return 返回上传后的文件名称
     */
    public static String uploadFile(File file) throws BaseException {
        return uploadFile(file, null, true);
    }
   /**
    * 上传文件
    * 删除传入的文件
    *
    * @param file 文件
    * @return 返回上传后的文件名称
    */
   public static String uploadFile(File file) throws BaseException {
      return uploadFile(file, null, true);
   }
    /**
     * 上传文件
     * 删除传入的文件
     *
     * @param file
     * @param templateType 模板类型
     * @return 返回上传后的文件名称
     */
    public static String uploadFile(File file, String templateType) throws BaseException {
        return uploadFile(file, templateType, true);
    }
   /**
    * 上传文件
    * 删除传入的文件
    *
    * @param file
    * @param templateType 模板类型
    * @return 返回上传后的文件名称
    */
   public static String uploadFile(File file, String templateType) throws BaseException {
      return uploadFile(file, templateType, true);
   }
    /**
     * 上传文件
     * 删除传入的文件
     *
     * @param file
     * @param templateType 模板类型
     * @return 返回上传后的文件名称
     */
    public static String uploadFile(File file, String templateType, String clientUuid) throws BaseException {
        return uploadFile(file, templateType, true, clientUuid);
    }
   /**
    * 上传文件
    * 删除传入的文件
    *
    * @param file
    * @param templateType 模板类型
    * @return 返回上传后的文件名称
    */
   public static String uploadFile(File file, String templateType, String clientUuid) throws BaseException {
      return uploadFile(file, templateType, true, clientUuid);
   }
    /**
     * @param file         文件
     * @param templateType 模板类型 1 = import 2 = print , 其他
     * @param deleteFile   是否删除传入的文件
     * @return
     */
    public static String uploadFile(File file, String templateType, boolean deleteFile, String clientUuid) throws BaseException {
        if (file == null || !file.isFile()) {
            throw new BaseException(FileCode.UPLOAD_FILE_NOT_EXISTS);
        }
        if (StringUtils.isEmpty(clientUuid)) {
            throw new BaseException(FileCode.GET_CLIENT_INFO_FAIL);
        }
        String dir;
        if (StringUtils.isEmpty(templateType)) {
            String timeStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
            dir = clientUuid + File.separator + timeStr;
        } else {
            dir = CmnConst.DIR_TEMPLATE + File.separator + ("1".equals(templateType) ? CmnConst.DIR_IMPORT : ("2".equals(templateType) ? CmnConst.DIR_PRINT : CmnConst.DIR_OTHER));
        }
        String saveFileName = System.currentTimeMillis() + RandomUtil.randomString(2);
        //文件加密
        boolean encryptFile = Global.getPropertyToBoolean("file.encrypt", "true");
   /**
    * @param file         文件
    * @param templateType 模板类型 1 = import 2 = print , 其他
    * @param deleteFile   是否删除传入的文件
    * @return
    */
   public static String uploadFile(File file, String templateType, boolean deleteFile, String clientUuid) throws BaseException {
      if (file == null || !file.isFile()) {
         throw new BaseException(FileCode.UPLOAD_FILE_NOT_EXISTS);
      }
      if (StringUtils.isEmpty(clientUuid)) {
         throw new BaseException(FileCode.GET_CLIENT_INFO_FAIL);
      }
      String dir;
      if (StringUtils.isEmpty(templateType)) {
         String timeStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
         dir = clientUuid + File.separator + timeStr;
      } else {
         dir = CmnConst.DIR_TEMPLATE + File.separator + ("1".equals(templateType) ? CmnConst.DIR_IMPORT : ("2".equals(templateType) ? CmnConst.DIR_PRINT : CmnConst.DIR_OTHER));
      }
      String saveFileName = System.currentTimeMillis() + RandomUtil.randomString(2);
      //文件加密
      boolean encryptFile = Global.getPropertyToBoolean("file.encrypt", "true");
        try {
            //上传至FTP 服务器
            if (FTPService.needUpload2FileServer()) {
                FTPService ftpService = new FTPService();
                String tail = file.getName().substring(file.getName().lastIndexOf("."));
                String tempEncryptFilePath = Global.getSystemConfig("temp.dir", "./attachment/temp") + File.separator + "encrypt_" + saveFileName + tail;
                FileUtil.copyFile(file, tempEncryptFilePath, encryptFile ? 1 : 0);
                ftpService.uploadFile(new FileInputStream(tempEncryptFilePath), saveFileName, dir);
                File sourceFile = new File(tempEncryptFilePath);
                if (sourceFile.isFile()) {
                    convertPdf(deleteFile, true, encryptFile, false, sourceFile, dir + File.separator + CmnConst.TRANSFER_DIR_NAME, saveFileName, file.getName());
                }
                if (deleteFile && file.isFile()) {
                    file.delete();
                }
                sourceFile.delete();
            } else {
                //上传到本地
                String path = Global.getSystemConfig("local.dir", "") + File.separator + dir + File.separator + saveFileName;
                FileUtil.copyFile(file, path, encryptFile ? 1 : 0);
                File sourceFile = new File(path);
                if (sourceFile.isFile()) {
                    convertPdf(false, encryptFile, false, sourceFile, dir + File.separator + CmnConst.TRANSFER_DIR_NAME, saveFileName, file.getName());
                }
                if (deleteFile && file.isFile()) {
                    file.delete();
                }
            }
            return saveFileName;
        } catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(FileCode.UPLOAD_FILE_FAIL);
        }
    }
      try {
         //上传至FTP 服务器
         if (FTPService.needUpload2FileServer()) {
            FTPService ftpService = new FTPService();
            String tail = file.getName().substring(file.getName().lastIndexOf("."));
            String tempEncryptFilePath = Global.getSystemConfig("temp.dir", "./attachment/temp") + File.separator + "encrypt_" + saveFileName + tail;
            FileUtil.copyFile(file, tempEncryptFilePath, encryptFile ? 1 : 0);
            ftpService.uploadFile(new FileInputStream(tempEncryptFilePath), saveFileName, dir);
            File sourceFile = new File(tempEncryptFilePath);
            if (sourceFile.isFile()) {
               convertPdf(deleteFile, true, encryptFile, false, sourceFile, dir + File.separator + CmnConst.TRANSFER_DIR_NAME, saveFileName, file.getName());
            }
            if (deleteFile && file.isFile()) {
               file.delete();
            }
            sourceFile.delete();
         } else {
            //上传到本地
            String path = Global.getSystemConfig("local.dir", "") + File.separator + dir + File.separator + saveFileName;
            FileUtil.copyFile(file, path, encryptFile ? 1 : 0);
            File sourceFile = new File(path);
            if (sourceFile.isFile()) {
               convertPdf(false, encryptFile, false, sourceFile, dir + File.separator + CmnConst.TRANSFER_DIR_NAME, saveFileName, file.getName());
            }
            if (deleteFile && file.isFile()) {
               file.delete();
            }
         }
         return saveFileName;
      } catch (Exception e) {
         e.printStackTrace();
         throw new BaseException(FileCode.UPLOAD_FILE_FAIL);
      }
   }
    /**
     * @param file         文件
     * @param templateType 模板类型 1 = import 2 = print , 其他
     * @param deleteFile   是否删除传入的文件
     * @return
     */
    public static String uploadFile(File file, String templateType, boolean deleteFile) throws BaseException {
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        String clientUuid = null;
        if (currentUser != null) {
            clientUuid = currentUser.getClient_uuid();
        }
        return uploadFile(file, templateType, deleteFile, clientUuid);
    }
   /**
    * @param file         文件
    * @param templateType 模板类型 1 = import 2 = print , 其他
    * @param deleteFile   是否删除传入的文件
    * @return
    */
   public static String uploadFile(File file, String templateType, boolean deleteFile) throws BaseException {
      SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
      String clientUuid = null;
      if (currentUser != null) {
         clientUuid = currentUser.getClient_uuid();
      }
      return uploadFile(file, templateType, deleteFile, clientUuid);
   }
    /**
     * 上传其他文件
     *
     * @param encryptFile 加密文件
     * @param catalogue   上传目录
     * @param file        上传文件
     * @param fileName    文件名称
     */
    public static void uploadOtherFile(boolean encryptFile, String catalogue, File file, String fileName) throws BaseException {
        uploadOtherFile(encryptFile, true, catalogue, file, fileName);
    }
   /**
    * 上传其他文件
    *
    * @param encryptFile 加密文件
    * @param catalogue   上传目录
    * @param file        上传文件
    * @param fileName    文件名称
    */
   public static void uploadOtherFile(boolean encryptFile, String catalogue, File file, String fileName) throws BaseException {
      uploadOtherFile(encryptFile, true, catalogue, file, fileName);
   }
    /**
     * 上传其他文件
     *
     * @param encryptFile  加密文件
     * @param uploadServer 上传至服务器
     * @param catalogue    上传目录
     * @param file         上传文件
     * @param fileName     文件名称
     */
    public static void uploadOtherFile(boolean encryptFile, boolean uploadServer, String catalogue, File file, String fileName) throws BaseException {
        if (file == null || !file.isFile()) {
            return;
        }
        try {
            catalogue = catalogue.replace("\\", "/");
            if (catalogue.indexOf("/") == 0) {
                catalogue = catalogue.substring(1);
            }
            if (uploadServer && FTPService.needUpload2FileServer()) {
                //上传至服务器
                FTPService ftpService = new FTPService();
                if (encryptFile) {
                    String path = Global.getSystemConfig("temp.dir", "") + "/upload_other_file_" + RandomUtil.randomString(5) + "_" + file.getName();
                    file = FileUtil.copyFile(file, path, 1);
                }
                FileInputStream is = new FileInputStream(file);
                ftpService.uploadFile(is, fileName, catalogue);
                is.close();
                if (encryptFile) {
                    file.delete();
                }
            } else {
                String path = Global.getSystemConfig("local.dir", "") + File.separator + catalogue + File.separator + fileName;
                FileUtil.copyFile(file, path, encryptFile ? 1 : 0);
            }
        } catch (Exception e) {
            throw new BaseException(FileCode.UPLOAD_FILE_FAIL);
        }
    }
   /**
    * 上传其他文件
    *
    * @param encryptFile  加密文件
    * @param uploadServer 上传至服务器
    * @param catalogue    上传目录
    * @param file         上传文件
    * @param fileName     文件名称
    */
   public static void uploadOtherFile(boolean encryptFile, boolean uploadServer, String catalogue, File file, String fileName) throws BaseException {
      if (file == null || !file.isFile()) {
         return;
      }
      try {
         catalogue = catalogue.replace("\\", "/");
         if (catalogue.indexOf("/") == 0) {
            catalogue = catalogue.substring(1);
         }
         if (uploadServer && FTPService.needUpload2FileServer()) {
            //上传至服务器
            FTPService ftpService = new FTPService();
            if (encryptFile) {
               String path = Global.getSystemConfig("temp.dir", "") + "/upload_other_file_" + RandomUtil.randomString(5) + "_" + file.getName();
               file = FileUtil.copyFile(file, path, 1);
            }
            FileInputStream is = new FileInputStream(file);
            ftpService.uploadFile(is, fileName, catalogue);
            is.close();
            if (encryptFile) {
               file.delete();
            }
         } else {
            String path = Global.getSystemConfig("local.dir", "") + File.separator + catalogue + File.separator + fileName;
            FileUtil.copyFile(file, path, encryptFile ? 1 : 0);
         }
      } catch (Exception e) {
         SpringMVCContextHolder.getSystemLogger().error(e);
         throw new BaseException(FileCode.UPLOAD_FILE_FAIL);
      }
   }
    /**
     * 替换文件
     *
     * @param sourceFileCatalogue 替换文件所在的目录 (attachment_url)
     * @param sourceFileName      替换的文件名称 (attachment_title)
     * @param originalFileName    原始文件名称 (file_name)
     * @param sourceFile          需要替换的文件
     * @param encryptSign         加密标识
     * @param isUploadServer      上传到服务器
     * @param convertPDF          是否转换PDF
     * @throws BaseException
     */
    public void replaceFile(String sourceFileCatalogue, String sourceFileName, String originalFileName, File sourceFile, boolean encryptSign, boolean isUploadServer, boolean convertPDF) throws BaseException {
        try {
            if (isUploadServer) {
                boolean deleteFile = false;
                if (encryptSign) {
                    //加密文件
                    String tempPath = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "encrypt_replace_" + IdUtil.randomUUID();
                    FileUtil.copyFile(sourceFile, tempPath, 1);
                    sourceFile = new File(tempPath);
                    deleteFile = true;
                }
                FTPService ftpService = new FTPService();
                InputStream is = new FileInputStream(sourceFile);
                ftpService.uploadFile(is, sourceFileName, sourceFileCatalogue);
                is.close();
                if (convertPDF && sourceFile.isFile()) {
                    convertPdf(deleteFile, isUploadServer, encryptSign, false, sourceFile, sourceFileCatalogue + File.separator + CmnConst.TRANSFER_DIR_NAME, sourceFileName, originalFileName);
                }
            } else {
                String localDir = Global.getSystemConfig("local.dir", "");
                FileUtil.copyFile(sourceFile, localDir + File.separator + sourceFileCatalogue + File.separator + sourceFileName, encryptSign ? 1 : 0);
                File file = new File(localDir + File.separator + sourceFileCatalogue + File.separator + sourceFileName);
                if (convertPDF && file.isFile()) {
                    convertPdf(false, encryptSign, false, file, sourceFileCatalogue + File.separator + CmnConst.TRANSFER_DIR_NAME, sourceFileName, originalFileName);
                }
            }
        } catch (Exception e) {
            throw new BaseException(FileCode.REPLACE_FILE_FAIL);
        }
    }
   /**
    * 替换文件
    *
    * @param sourceFileCatalogue 替换文件所在的目录 (attachment_url)
    * @param sourceFileName      替换的文件名称 (attachment_title)
    * @param originalFileName    原始文件名称 (file_name)
    * @param sourceFile          需要替换的文件
    * @param encryptSign         加密标识
    * @param isUploadServer      上传到服务器
    * @param convertPDF          是否转换PDF
    * @throws BaseException
    */
   public void replaceFile(String sourceFileCatalogue, String sourceFileName, String originalFileName, File sourceFile, boolean encryptSign, boolean isUploadServer, boolean convertPDF) throws BaseException {
      try {
         if (isUploadServer) {
            boolean deleteFile = false;
            if (encryptSign) {
               //加密文件
               String tempPath = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "encrypt_replace_" + IdUtil.randomUUID();
               FileUtil.copyFile(sourceFile, tempPath, 1);
               sourceFile = new File(tempPath);
               deleteFile = true;
            }
            FTPService ftpService = new FTPService();
            InputStream is = new FileInputStream(sourceFile);
            ftpService.uploadFile(is, sourceFileName, sourceFileCatalogue);
            is.close();
            if (convertPDF && sourceFile.isFile()) {
               convertPdf(deleteFile, isUploadServer, encryptSign, false, sourceFile, sourceFileCatalogue + File.separator + CmnConst.TRANSFER_DIR_NAME, sourceFileName, originalFileName);
            }
         } else {
            String localDir = Global.getSystemConfig("local.dir", "");
            FileUtil.copyFile(sourceFile, localDir + File.separator + sourceFileCatalogue + File.separator + sourceFileName, encryptSign ? 1 : 0);
            File file = new File(localDir + File.separator + sourceFileCatalogue + File.separator + sourceFileName);
            if (convertPDF && file.isFile()) {
               convertPdf(false, encryptSign, false, file, sourceFileCatalogue + File.separator + CmnConst.TRANSFER_DIR_NAME, sourceFileName, originalFileName);
            }
         }
      } catch (Exception e) {
         SpringMVCContextHolder.getSystemLogger().error(e);
         throw new BaseException(FileCode.REPLACE_FILE_FAIL);
      }
   }
    /**
     * 替换文件
     *
     * @param uuid       附件表uuid
     * @param sourceFile
     * @return 返回文件记录
     */
    public FieldSetEntity replaceFile(String uuid, File sourceFile) throws BaseException {
        FieldSetEntity fse = getFileRecord(uuid);
        replaceFile(fse.getString(CmnConst.ATTACHMENT_URL), fse.getString(CmnConst.ATTACHMENT_TITLE), fse.getString(CmnConst.FILE_NAME), sourceFile, fse.getBoolean(CmnConst.ENCRPT_SIGN), fse.getBoolean(CmnConst.UPLOAD_SIGN), fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN));
        return fse;
    }
   /**
    * 替换文件
    *
    * @param uuid       附件表uuid
    * @param sourceFile
    * @return 返回文件记录
    */
   public FieldSetEntity replaceFile(String uuid, File sourceFile) throws BaseException {
      FieldSetEntity fse = getFileRecord(uuid);
      replaceFile(fse.getString(CmnConst.ATTACHMENT_URL), fse.getString(CmnConst.ATTACHMENT_TITLE), fse.getString(CmnConst.FILE_NAME), sourceFile, fse.getBoolean(CmnConst.ENCRPT_SIGN), fse.getBoolean(CmnConst.UPLOAD_SIGN), fse.getBoolean(CmnConst.VIEW_ONLINE_SIGN));
      return fse;
   }
    /**
     * 转换pdf
     *
     * @param uploadServer   上传到服务器
     * @param isEncrypt      是否加密
     * @param threadSync     线程同步
     * @param file           文件
     * @param placeLocation  文件所在目录
     * @param fileName       文件名称
     * @param sourceFileName 源文件名称
     * @return
     * @throws BaseException
     */
    public static boolean convertPdf(boolean uploadServer, boolean isEncrypt, boolean threadSync, File file, String placeLocation, String fileName, String sourceFileName) throws BaseException {
        return convertPdf(false, uploadServer, isEncrypt, threadSync, file, placeLocation, fileName, sourceFileName);
    }
   /**
    * 转换pdf
    *
    * @param uploadServer   上传到服务器
    * @param isEncrypt      是否加密
    * @param threadSync     线程同步
    * @param file           文件
    * @param placeLocation  文件所在目录
    * @param fileName       文件名称
    * @param sourceFileName 源文件名称
    * @return
    * @throws BaseException
    */
   public static boolean convertPdf(boolean uploadServer, boolean isEncrypt, boolean threadSync, File file, String placeLocation, String fileName, String sourceFileName) throws BaseException {
      return convertPdf(false, uploadServer, isEncrypt, threadSync, file, placeLocation, fileName, sourceFileName);
   }
    /**
     * @param threadSync    线程同步 false 异步转换
     * @param file          需要转换的文件
     * @param placeLocation 转换后存放的路径 (不需要拼接服务器文件夹路径)
     * @param fileName      转换后的文件名称
     * @return 是否转换成功 异步转换时忽略该返回
     */
    public static boolean convertPdf(boolean deleteFile, boolean uploadServer, boolean isEncrypt, boolean threadSync, File file, String placeLocation, String fileName, String sourceFileName) throws BaseException {
        if (file.isFile() && !StringUtils.isEmpty(placeLocation) && !StringUtils.isEmpty(fileName)) {
            String tail = sourceFileName.substring(sourceFileName.lastIndexOf(".") + 1);
            boolean needTransferFlag = Global.getPropertyToBoolean("file.view.online", "true") && ("," + Global.getSystemConfig("can.transfer.format", "") + ",").contains("," + tail + ",");
            if (!needTransferFlag) {
                return false;
            }
            placeLocation = placeLocation.replace("\\", "/");
            if (placeLocation.indexOf("/") != 0) {
                placeLocation += "/";
            }
            //线程同步
            if (threadSync) {
                boolean b = convertPdf(uploadServer, isEncrypt, file, placeLocation, fileName +"."+tail);
                if (deleteFile && file.isFile()) {
                    file.delete();
                }
                return b;
            } else {
                ExecutorService executorService = Executors.newSingleThreadExecutor();
                String finalPlaceLocation = placeLocation;
                final File ff = FileUtil.copyFile(file, Global.getSystemConfig("temp.dir", "") + "/" + "temp_convert_pdf_" + RandomUtil.randomString(5) + "_" + file.getName(), 0);
                executorService.submit(() -> {
                    convertPdf(uploadServer, isEncrypt, ff, finalPlaceLocation, fileName+"."+tail);
                    if (ff.isFile()) {
                        ff.delete();
                    }
                    if (deleteFile && file.isFile()) {
                        file.delete();
                    }
                });
            }
        }
        return false;
    }
   /**
    * @param threadSync    线程同步 false 异步转换
    * @param file          需要转换的文件
    * @param placeLocation 转换后存放的路径 (不需要拼接服务器文件夹路径)
    * @param fileName      转换后的文件名称
    * @return 是否转换成功 异步转换时忽略该返回
    */
   public static boolean convertPdf(boolean deleteFile, boolean uploadServer, boolean isEncrypt, boolean threadSync, File file, String placeLocation, String fileName, String sourceFileName) throws BaseException {
      if (file.isFile() && !StringUtils.isEmpty(placeLocation) && !StringUtils.isEmpty(fileName)) {
         String tail = sourceFileName.substring(sourceFileName.lastIndexOf(".") + 1);
         boolean needTransferFlag = Global.getPropertyToBoolean("file.view.online", "true") && ("," + Global.getSystemConfig("can.transfer.format", "") + ",").contains("," + tail + ",");
         if (!needTransferFlag) {
            return false;
         }
         placeLocation = placeLocation.replace("\\", "/");
         if (placeLocation.indexOf("/") != 0) {
            placeLocation += "/";
         }
         //线程同步
         if (threadSync) {
            boolean b = convertPdf(uploadServer, isEncrypt, file, placeLocation, fileName, tail);
            if (deleteFile && file.isFile()) {
               file.delete();
            }
            return b;
         } else {
            ExecutorService executorService = Executors.newSingleThreadExecutor();
            String finalPlaceLocation = placeLocation;
            final File ff = FileUtil.copyFile(file, Global.getSystemConfig("temp.dir", "") + "/" + "temp_convert_pdf_" + RandomUtil.randomString(5) + "_" + file.getName(), 0);
            executorService.submit(() -> {
               convertPdf(uploadServer, isEncrypt, ff, finalPlaceLocation, fileName, tail);
               if (ff.isFile()) {
                  ff.delete();
               }
               if (deleteFile && file.isFile()) {
                  file.delete();
               }
            });
         }
      }
      return false;
   }
    private static boolean convertPdf(boolean uploadServer, boolean isEncrypt, File file, String placeLocation, String fileName) throws BaseException {
        File pdfFile = null;
        String random = RandomUtil.randomString(5);
        String tempPath = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_" + random + "_" + file.getName();
        String tempPathSuccess = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_success_" + random + ".pdf";
        try {
            int lastIndex = fileName.lastIndexOf(".");
            String officeType = fileName.substring(lastIndex+1);
            fileName=fileName.substring(0,lastIndex);
            FileUtil.copyFile(file, tempPath, 0);
            if(Global.getPropertyToBoolean("open.office.isEnable", "true")) {//启用oepn office转换
               pdfFile = PdfConcurrenceUtil.convertToPdf(tempPath, tempPathSuccess);
            }else{
               pdfFile = new File(AsposeUtil.OfficeToPdf(tempPath, tempPathSuccess,officeType));
           }
            String s = Global.getSystemConfig("temp.dir", "") + "/" + "convertPDF_encryptTemp_" + random + ".pdf";
            FileUtil.copyFile(pdfFile, s, isEncrypt ? 1 : 0);
            pdfFile.delete();
            pdfFile = new File(s);
            uploadOtherFile(false, uploadServer, placeLocation, pdfFile, fileName);
            return true;
        }
        catch (BaseException e) {
           throw e;
        }catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(FileCode.CONVERT_PDF_FILE_FAIL);
        } finally {
            try {
                if (pdfFile !=null && pdfFile.isFile()) {
                    pdfFile.delete();
                }
                com.product.common.io.FileUtils.delFile(tempPath);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
   private static boolean convertPdf(boolean uploadServer, boolean isEncrypt, File file, String placeLocation, String fileName, String officeType) throws BaseException {
      File pdfFile = null;
      String random = RandomUtil.randomString(5);
      String tempPath = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_" + random + "_" + file.getName();
      String tempPathSuccess = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_success_" + random + ".pdf";
      try {
         FileUtil.copyFile(file, tempPath, 0);
         pdfFile = PdfConcurrenceUtil.convertToPdf(tempPath, tempPathSuccess, officeType);
         String s = Global.getSystemConfig("temp.dir", "") + "/" + "convertPDF_encryptTemp_" + random + ".pdf";
         FileUtil.copyFile(pdfFile, s, isEncrypt ? 1 : 0);
         pdfFile.delete();
         pdfFile = new File(s);
         uploadOtherFile(false, uploadServer, placeLocation, pdfFile, fileName);
         return true;
      } catch (BaseException e) {
         throw e;
      } catch (Exception e) {
         e.printStackTrace();
         throw new BaseException(FileCode.CONVERT_PDF_FILE_FAIL);
      } finally {
         try {
            if (pdfFile != null && pdfFile.isFile()) {
               pdfFile.delete();
            }
            com.product.common.io.FileUtils.delFile(tempPath);
         } catch (Exception e) {
            e.printStackTrace();
         }
      }
   }
}