许鹏程
2024-05-28 927359fdce884acdcd76b90008eb0303f4bdd29d
commit
已修改3个文件
1206 ■■■■ 文件已修改
src/main/java/com/product/file/service/FileManagerService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/CreateDocumentIndexThread.java 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/FileUtils.java 1111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/service/FileManagerService.java
@@ -348,7 +348,7 @@
                attachmentFse.setValue(CmnConst.ENCRPT_SIGN, Global.getPropertyToBoolean("file.encrypt", "true") ? 1 : 0);
                attachmentFse.setValue(CmnConst.ATTACHMENT_SIZE, fileLength);
                attachmentFse.setValue(CmnConst.UPLOAD_SIGN, needUpload2FileServerFlag ? 1 : 0);
                attachmentFse.setValue(CmnConst.FUNCTION_UUID, fse.getString(CmnConst.FUNCTION_UUID));
                attachmentFse.setValue(CmnConst.ATTACHMENT_CONTAINER, fse.getString(CmnConst.ATTACHMENT_CONTAINER));
                attachmentFse.setValue(CmnConst.ATTACHMENT_DOMAIN, fse.getString(CmnConst.ATTACHMENT_DOMAIN));
                attachmentFse.setValue(CmnConst.MODULE_UUID, fse.getString(CmnConst.MODULE_UUID));
@@ -541,7 +541,7 @@
            try {
                temp.createNewFile();
            } catch (IOException e) {
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (e.getMessage() != null ? e.getMessage() : ""));
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (e.getMessage() != null ? e.getMessage() + ",uuid:" + attachmentFse.getUUID() : ""));
            }
            try (FileOutputStream fos = new FileOutputStream(temp); BufferedOutputStream out = new BufferedOutputStream(fos)) {
@@ -549,10 +549,10 @@
                return temp;
            } catch (Exception e) {
                e.printStackTrace();
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (e.getMessage() != null ? e.getMessage() : ""));
                throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + (e.getMessage() != null ? e.getMessage() + ",uuid:" + attachmentFse.getUUID() : ""));
            }
        }
        throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText());
        throw new BaseException(FileCode.GET_FILE_FAIL.getValue(), FileCode.GET_FILE_FAIL.getText() + ",uuid:" + attachmentFse.getUUID());
    }
    /**
src/main/java/com/product/file/util/CreateDocumentIndexThread.java
@@ -1,6 +1,10 @@
package com.product.file.util;
import java.util.LinkedList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -13,22 +17,28 @@
/**
 * 消息服务,添加消息,读取消息
 * @author shicf
 *
 * @author shicf
 */
@Component
public class CreateDocumentIndexThread   {
    /**自已实例**/
public class CreateDocumentIndexThread {
    /**
     * 自已实例
     **/
    private static CreateDocumentIndexThread createDocumentIndexThread;
    @Autowired
    public FileManagerService fileManagerService;
    /**内部线程**/
    private SendMailThread sendMailThread=null;
    /**
     * 内部线程
     **/
    private SendMailThread sendMailThread = null;
    @Autowired
    public LuceneService luceneService;
    /** 生成的新消息队列**/
    private static LinkedList <FieldSetEntity> documentIndexs=new LinkedList<>();
    /**
     * 生成的新消息队列
     **/
    private static LinkedList<FieldSetEntity> documentIndexs = new LinkedList<>();
    /**
     * 静态工厂方法 获取当前对象实例 多线程安全单例模式(使用双重同步锁)
     */
@@ -37,57 +47,88 @@
        if (createDocumentIndexThread == null) {
            synchronized (CreateDocumentIndexThread.class) {
                if (createDocumentIndexThread == null) {
                    createDocumentIndexThread=(CreateDocumentIndexThread) SpringBeanUtil.getBean("createDocumentIndexThread");
                    createDocumentIndexThread = (CreateDocumentIndexThread) SpringBeanUtil.getBean("createDocumentIndexThread");
                }
            }
        }
        createDocumentIndexThread.start();
        return createDocumentIndexThread;
    }
    /**
     * 启动缓存的刷新线程
     */
    public  void start() {
        if(sendMailThread ==null || sendMailThread.getState()== Thread.State.TERMINATED ) {
            sendMailThread=new SendMailThread();
    public void start() {
        if (sendMailThread == null || sendMailThread.getState() == Thread.State.TERMINATED) {
            sendMailThread = new SendMailThread();
            sendMailThread.start();
            SpringMVCContextHolder.getSystemLogger().info("Thread Of Refresh Cache Is Starting.............");
        }
    }
    /**
     * 把附件信息添加对列中
     *
     * @param user
     */
    public synchronized void appendAttaInfo(FieldSetEntity documentIndex) {
        if(documentIndex!=null) {
        if (documentIndex != null) {
            documentIndexs.add(documentIndex);
        }
    }
    //重试文件的uuid集合
    private Set<String> retryFileUuids = new HashSet<>();
    /**
     * 取刷新表队表的第一个
     *
     * @return
     */
    public synchronized void pop() {
        while(!documentIndexs.isEmpty()) {
            FieldSetEntity ff=documentIndexs.pop();
            if(luceneService ==null ) {
                luceneService=(LuceneService) SpringBeanUtil.getBean("luceneService");
        while (!documentIndexs.isEmpty()) {
            FieldSetEntity ff = documentIndexs.pop();
            if (luceneService == null) {
                luceneService = (LuceneService) SpringBeanUtil.getBean("luceneService");
            }
            ff.setValue("file", fileManagerService.getFile(ff.getString("attachment_uuid")));
            luceneService.createdIndex(ff);
            try {
                ff.setValue("file", fileManagerService.getFile(ff.getString("attachment_uuid")));
            } catch (Exception e) {
                if (retryFileUuids.contains(ff.getString("attachment_uuid"))) {
                    //重试过的文件不再重试,删除队列中的文件
                    retryFileUuids.remove(ff.getString("attachment_uuid"));
                    continue;
                } else {
                    retryFileUuids.add(ff.getString("attachment_uuid"));
                    //添加到队列的最后
                    appendAttaInfo(ff);
                    continue;
                }
            }
            try {
                luceneService.createdIndex(ff);
            } catch (OLE2NotOfficeXmlFileException e) {
                e.printStackTrace();
                SpringMVCContextHolder.getSystemLogger().error(e);
            } catch (Exception e) {
                SpringMVCContextHolder.getSystemLogger().error(e);
                e.printStackTrace();
            }
        }
    }
    /**
     * 内部线程,定时刷新缓存
     * @author shicf
     *
     * @author shicf
     */
    class SendMailThread extends Thread {
    class SendMailThread extends Thread {
        @Override
        public void run() {
            try {
                while(true) {
                while (true) {
                    sleep(2000);// 执行间隔2s
                    pop();
                }
src/main/java/com/product/file/util/FileUtils.java
@@ -33,584 +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,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();
            }
        }
    }
    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();
            }
        }
    }
}