接受文件类型 是否删除 响应类
private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile, HttpServletResponse response) throws IOException { String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID(); String filePath = doExportFile(fileOutputType, docFileName); String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 try { // 读取,返回 ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); } finally { handleDeleteFile(deleteFile, filePath); } }
输出文件到指定目录并返回文件路径
/** * 输出文件,返回文件路径 * * @param fileOutputType 文件类型 * @param fileName 文件名, 无需 ".docx" 等文件后缀 * @return 生成的文件所在路径 */ private String doExportFile(EngineFileType fileOutputType, String fileName) { try (HikariDataSource dataSource = buildDataSource()) { // 创建 screw 的配置 Configuration config = Configuration.builder() .version(DOC_VERSION) // 版本 1.0.0 .description(DOC_DESCRIPTION) // 描述 文档描述 .dataSource(dataSource) // 数据源 .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置 .produceConfig(buildProcessConfig()) // 处理配置 .build(); // 执行 screw,生成数据库文档 new DocumentationExecute(config).execute(); return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix(); }
/** * 创建 screw 的引擎配置 */ private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) { return EngineConfig.builder() .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径 .openOutputDir(false) // 打开目录 .fileType(fileOutputType) // 文件类型 .produceType(EngineTemplateType.velocity) // 文件类型 .fileName(docFileName) // 自定义文件名称 .build(); }
/** * 创建 screw 的处理配置,一般可忽略 * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置 */ private static ProcessConfig buildProcessConfig() { return ProcessConfig.builder() .ignoreTablePrefix(Arrays.asList("QRTZ_", "ACT_")) // 忽略表前缀 .build(); }
输出附件
/** * 返回附件 * * @param response 响应 * @param filename 文件名 * @param content 附件内容 * @throws IOException */ public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException { // 设置 header 和 contentType response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 输出附件 IoUtil.write(response.getOutputStream(), false, content); }