diff --git a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java index 6b68ebe6..f0057d1c 100644 --- a/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java +++ b/zt-module-infra/zt-module-infra-server/src/main/java/com/zt/plat/module/infra/controller/admin/file/FileController.java @@ -31,6 +31,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import static com.zt.plat.framework.common.pojo.CommonResult.error; import static com.zt.plat.framework.common.pojo.CommonResult.success; import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static com.zt.plat.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; @@ -52,13 +53,13 @@ public class FileController { private FileService fileService; @GetMapping("/get") - @Operation(summary = "获取文件预览地址", description = "根据 fileId 返回文件预览 url(kkfile),支持加密文件预览,需要传递验证码 code,加密文件预览地址默认5分钟内有效,可在配置文件中添加zt.file.preview-expire-seconds配置") + @Operation(summary = "获取文件预览地址", description = "根据 fileId 返回文件预览 url(kkfile),支持加密文件预览,加密文件预览地址默认5分钟内有效,可在配置文件中添加zt.file.preview-expire-seconds配置有效时间") public CommonResult getPreviewUrl(@RequestParam("fileId") Long fileId, @RequestParam(value = "code", required = false) String code, HttpServletRequest request) throws Exception { FileDO fileDO = fileService.getActiveFileById(fileId); if (fileDO == null) { - return CommonResult.error(HttpStatus.NOT_FOUND.value(), "文件不存在"); + return error(HttpStatus.NOT_FOUND.value(), "文件不存在"); } // 统计下载次数 @@ -68,26 +69,24 @@ public class FileController { FileRespVO fileRespVO = BeanUtils.toBean(fileDO, FileRespVO.class); // 加密文件:塞入“临时解密预览 URL” - if (Boolean.TRUE.equals(fileRespVO.getIsEncrypted())) { // FileDO 通过 aesIv 判断加密 + if (Boolean.TRUE.equals(fileRespVO.getIsEncrypted()) // FileDO 通过 aesIv 判断加密 + && cn.hutool.core.util.StrUtil.isNotBlank(code)) { // 预览文件会调用两次该接口,只有code不为空时候才塞url - if (cn.hutool.core.util.StrUtil.isBlank(code)) { + /*if (cn.hutool.core.util.StrUtil.isBlank(code)) { return CommonResult.error(HttpStatus.BAD_REQUEST.value(), "加密文件预览需要验证码 code"); - } + }*/ + // 验证通过:发放给 kkfile 用的短期 token(kkfile 不带登录态) Long userId = getLoginUserId(); boolean flag = fileService.verifyCode(fileId, userId, code); if(!flag){ - return CommonResult.customize(null, HttpStatus.INTERNAL_SERVER_ERROR.value(), "验证码错误"); + return error(HttpStatus.BAD_REQUEST.value(), "验证码错误"); } - String token = fileService.generatePreviewToken(fileId, userId); - String baseUrl = buildPublicBaseUrl(request); // 见下方函数 - String fullfilename = java.net.URLEncoder .encode(fileDO.getName(), java.nio.charset.StandardCharsets.UTF_8) .replace("+", "%20"); - String decryptUrl = baseUrl + "/admin-api/infra/file/preview-decrypt" + "?fileId=" + fileId + "&token=" + token @@ -215,14 +214,14 @@ public class FileController { try { sendTypeEnum = VerifyCodeSendType.valueOf(sendType.trim().toUpperCase()); } catch (IllegalArgumentException ex) { - return CommonResult.error(HttpStatus.BAD_REQUEST.value(), + return error(HttpStatus.BAD_REQUEST.value(), "sendType 参数不合法,可选:SMS / E_OFFICE"); } } FileDO activeFileById = fileService.getActiveFileById(fileId); if (activeFileById == null) { - return CommonResult.error(HttpStatus.NOT_FOUND.value(), "文件不存在"); + return error(HttpStatus.NOT_FOUND.value(), "文件不存在"); } FileRespVO fileRespVO = BeanUtils.toBean(activeFileById, FileRespVO.class);