From ee6cec9d7f545837417ced772f491a28cdfafb34 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 15 Aug 2025 15:02:37 +0800 Subject: [PATCH] 133334444 --- .../file/constant/OSSFileTypeEnum.java | 26 +++++ .../file/controller/OSSFileController.java | 98 +++++++++++++++++++ .../business/file/domain/vo/OSSPolicyVO.java | 28 ++++++ .../support/AdminUEditorController.java | 97 ++++++++++++++++++ .../main/resources/static/ueditor-config.json | 71 ++++++++++++++ 5 files changed, 320 insertions(+) create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/constant/OSSFileTypeEnum.java create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/controller/OSSFileController.java create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/domain/vo/OSSPolicyVO.java create mode 100644 sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminUEditorController.java create mode 100644 sa-admin/src/main/resources/static/ueditor-config.json diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/constant/OSSFileTypeEnum.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/constant/OSSFileTypeEnum.java new file mode 100644 index 0000000..cd3535d --- /dev/null +++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/constant/OSSFileTypeEnum.java @@ -0,0 +1,26 @@ +package net.lab1024.sa.admin.module.business.file.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.lab1024.sa.base.common.enumeration.BaseEnum; + +@AllArgsConstructor +@Getter +public enum OSSFileTypeEnum implements BaseEnum { + PUBLIC(1, "public"), + SIGN(2, "sign"), + ; + + public static OSSFileTypeEnum getByVal(int val){ + OSSFileTypeEnum[] values = OSSFileTypeEnum.values(); + for(OSSFileTypeEnum type:values){ + if(val == type.getValue()){ + return type; + } + } + return null; + } + private final Integer value; + + private final String desc; +} diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/controller/OSSFileController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/controller/OSSFileController.java new file mode 100644 index 0000000..8a4fcfa --- /dev/null +++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/controller/OSSFileController.java @@ -0,0 +1,98 @@ +package net.lab1024.sa.admin.module.business.file.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.common.utils.BinaryUtil; +import com.aliyun.oss.model.MatchMode; +import com.aliyun.oss.model.PolicyConditions; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import net.lab1024.sa.admin.config.OssConfig; +import net.lab1024.sa.admin.constant.AdminSwaggerTagConst; +import net.lab1024.sa.admin.module.business.file.constant.OSSFileTypeEnum; +import net.lab1024.sa.admin.module.business.file.domain.vo.OSSPolicyVO; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.util.SmartRequestUtil; +import net.lab1024.sa.base.constant.SwaggerTagConst; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.File; +import java.util.Date; + +@RestController +@Tag(name = SwaggerTagConst.Support.FILE) +public class OSSFileController { + + @Resource + private OssConfig ossConfig; + + @Operation(summary = "获取上传文件 Policy, notes=\"type==1 普通;type==2 签名图片\"") + @GetMapping("/file/getOSSPolicy/{type}") + @SaCheckPermission("ossFile:add") + public ResponseDTO getOSSPolicy(@PathVariable int type){ + OSSFileTypeEnum ossFileType = OSSFileTypeEnum.getByVal(type); + Long requestUserId = SmartRequestUtil.getRequestUserId(); + String dir = ossFileType.getDesc() + File.separator + "images/"; +// String dir = ossFileType.getDesc() + File.separator + requestUserId + File.separator; + // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 + OSSClient client = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccessKey(), ossConfig.getAccessKeySecret()); + try { + long expireTime = 30; + long expireEndTime = System.currentTimeMillis() + expireTime * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 10*1024*1024);// 最大 10 M + policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossFileType.getDesc()); + + String postPolicy = client.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes("utf-8"); + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = client.calculatePostSignature(postPolicy); + + + OSSPolicyVO policyVO = new OSSPolicyVO(ossConfig.getAccessKey(), encodedPolicy, postSignature, dir, ossConfig.getCustomDomainName(), String.valueOf(expireEndTime / 1000)); + return ResponseDTO.ok(policyVO); + } catch (Exception e) { + e.printStackTrace(); + return ResponseDTO.userErrorParam(); + } + } + + @Operation(summary = "获取上传文件 Policy, notes=\"type==1 普通;type==2 签名图片\"") + @GetMapping("/file/getOSSPolicy/admin/{type}") + @SaCheckPermission("ossFile:addAdmin") + + public ResponseDTO getOSSPolicyAdmin(@PathVariable int type){ + OSSFileTypeEnum ossFileType = OSSFileTypeEnum.getByVal(type); + Long requestUserId = SmartRequestUtil.getRequestUserId(); + String dir = ossFileType.getDesc() + File.separator + "images/"; +// String dir = ossFileType.getDesc() + File.separator + requestUserId + File.separator; + // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。 + OSSClient client = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccessKey(), ossConfig.getAccessKeySecret()); + try { + long expireTime = 30; + long expireEndTime = System.currentTimeMillis() + expireTime * 1000; + Date expiration = new Date(expireEndTime); + PolicyConditions policyConds = new PolicyConditions(); + policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 10*1024*1024);// 最大 10 M + policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, ossFileType.getDesc()); + + String postPolicy = client.generatePostPolicy(expiration, policyConds); + byte[] binaryData = postPolicy.getBytes("utf-8"); + String encodedPolicy = BinaryUtil.toBase64String(binaryData); + String postSignature = client.calculatePostSignature(postPolicy); + + + OSSPolicyVO policyVO = new OSSPolicyVO(ossConfig.getAccessKey(), encodedPolicy, postSignature, dir, ossConfig.getCustomDomainName(), String.valueOf(expireEndTime / 1000)); + return ResponseDTO.ok(policyVO); + } catch (Exception e) { + e.printStackTrace(); + return ResponseDTO.userErrorParam(); + } + } +} diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/domain/vo/OSSPolicyVO.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/domain/vo/OSSPolicyVO.java new file mode 100644 index 0000000..7a1eec2 --- /dev/null +++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/file/domain/vo/OSSPolicyVO.java @@ -0,0 +1,28 @@ +package net.lab1024.sa.admin.module.business.file.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class OSSPolicyVO { + + @Schema(description = "OSS accessid") + private String accessid; + + @Schema(description = "OSS policy") + private String policy; + + @Schema(description = "OSS 签名") + private String signature; + + @Schema(description = "OSS 上传路径") + private String dir; + + @Schema(description = "OSS host") + private String host; + + @Schema(description = "OSS 过期时间") + private String expire; +} diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminUEditorController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminUEditorController.java new file mode 100644 index 0000000..7c9d75c --- /dev/null +++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/system/support/AdminUEditorController.java @@ -0,0 +1,97 @@ +package net.lab1024.sa.admin.module.system.support; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import net.lab1024.sa.base.common.controller.SupportBaseController; + +import net.lab1024.sa.base.constant.SwaggerTagConst; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +/** + * UEditor配置接口 + * + * @Author 1024创新实验室: 罗伊 + * @Date 2024年12月19日 + * @Wechat zhuoda1024 + * @Email lab1024@163.com + * @Copyright 1024创新实验室 + */ +@RestController +@Tag(name = SwaggerTagConst.Support.FILE) +public class AdminUEditorController extends SupportBaseController { + + @Operation(summary = "获取UEditor配置 @author 1024创新实验室") + @GetMapping("/ueditor/config") + public Map getUEditorConfig() { + // UEditor期望的配置格式:直接的配置对象,支持JSONP + Map config = new HashMap<>(); + + // 图片上传配置 + config.put("imageActionName", "uploadimage"); + config.put("imageFieldName", "file"); + config.put("imageMaxSize", 8388608); + config.put("imageAllowFiles", new String[]{".jpg", ".png", ".jpeg"}); + config.put("imageCompressEnable", false); + config.put("imageCompressBorder", 5000); + config.put("imageInsertAlign", "none"); + config.put("imageUrlPrefix", ""); + + // 涂鸦配置 + config.put("scrawlActionName", "uploadscrawl"); + config.put("scrawlFieldName", "file"); + config.put("scrawlMaxSize", 10485760); + config.put("scrawlUrlPrefix", ""); + config.put("scrawlInsertAlign", "none"); + + // 截图配置 + config.put("snapscreenActionName", "uploadimage"); + config.put("snapscreenUrlPrefix", ""); + config.put("snapscreenInsertAlign", "none"); + + // 图片抓取配置 + config.put("catcherActionName", "catchimage"); + config.put("catcherFieldName", "source"); + config.put("catcherLocalDomain", new String[]{"127.0.0.1", "localhost"}); + config.put("catcherUrlPrefix", ""); + config.put("catcherMaxSize", 10485760); + config.put("catcherAllowFiles", new String[]{".jpg", ".png", ".jpeg"}); + + // 视频上传配置 + config.put("videoActionName", "uploadvideo"); + config.put("videoFieldName", "file"); + config.put("videoUrlPrefix", ""); + config.put("videoMaxSize", 104857600); + config.put("videoAllowFiles", new String[]{".mp4"}); + + // 文件上传配置 + config.put("fileActionName", "uploadfile"); + config.put("fileFieldName", "file"); + config.put("fileUrlPrefix", ""); + config.put("fileMaxSize", 104857600); + config.put("fileAllowFiles", new String[]{".zip", ".pdf", ".doc"}); + + // 图片管理配置 + config.put("imageManagerActionName", "listimage"); + config.put("imageManagerListSize", 20); + config.put("imageManagerUrlPrefix", ""); + config.put("imageManagerInsertAlign", "none"); + config.put("imageManagerAllowFiles", new String[]{".jpg", ".png", ".jpeg"}); + + // 文件管理配置 + config.put("fileManagerActionName", "listfile"); + config.put("fileManagerUrlPrefix", ""); + config.put("fileManagerListSize", 20); + config.put("fileManagerAllowFiles", new String[]{".zip", ".pdf", ".doc"}); + + // 公式配置 + Map formulaConfig = new HashMap<>(); + formulaConfig.put("imageUrlTemplate", "https://r.latexeasy.com/image.svg?{}"); + config.put("formulaConfig", formulaConfig); + + return config; + } +} diff --git a/sa-admin/src/main/resources/static/ueditor-config.json b/sa-admin/src/main/resources/static/ueditor-config.json new file mode 100644 index 0000000..5b8bf52 --- /dev/null +++ b/sa-admin/src/main/resources/static/ueditor-config.json @@ -0,0 +1,71 @@ +{ + "imageActionName": "image", + "imageFieldName": "file", + "imageMaxSize": 8388608, + "imageAllowFiles": [ + ".jpg", + ".png", + ".jpeg" + ], + "imageCompressEnable": false, + "imageCompressBorder": 5000, + "imageInsertAlign": "none", + "imageUrlPrefix": "", + "scrawlActionName": "crawl", + "scrawlFieldName": "file", + "scrawlMaxSize": 10485760, + "scrawlUrlPrefix": "", + "scrawlInsertAlign": "none", + "snapscreenActionName": "snap", + "snapscreenUrlPrefix": "", + "snapscreenInsertAlign": "none", + "catcherActionName": "catch", + "catcherFieldName": "source", + "catcherLocalDomain": [ + "127.0.0.1", + "localhost" + ], + "catcherUrlPrefix": "", + "catcherMaxSize": 10485760, + "catcherAllowFiles": [ + ".jpg", + ".png", + ".jpeg" + ], + "videoActionName": "video", + "videoFieldName": "file", + "videoUrlPrefix": "", + "videoMaxSize": 104857600, + "videoAllowFiles": [ + ".mp4" + ], + "fileActionName": "file", + "fileFieldName": "file", + "fileUrlPrefix": "", + "fileMaxSize": 104857600, + "fileAllowFiles": [ + ".zip", + ".pdf", + ".doc" + ], + "imageManagerActionName": "listImage", + "imageManagerListSize": 20, + "imageManagerUrlPrefix": "", + "imageManagerInsertAlign": "none", + "imageManagerAllowFiles": [ + ".jpg", + ".png", + ".jpeg" + ], + "fileManagerActionName": "listFile", + "fileManagerUrlPrefix": "", + "fileManagerListSize": 20, + "fileManagerAllowFiles": [ + ".zip", + ".pdf", + ".doc" + ], + "formulaConfig": { + "imageUrlTemplate": "https://r.latexeasy.com/image.svg?{}" + } +}