From d7cfd8598d149fe627d0dc106cb9b80b16f6e4bf Mon Sep 17 00:00:00 2001 From: Vinjor Date: Fri, 20 Jun 2025 17:43:53 +0800 Subject: [PATCH] 1 --- dl_admin/pom.xml | 15 ++- dl_admin/ruoyi-admin/pom.xml | 23 ++++- .../ueditorConfig/UeditorController.java | 39 ++++---- .../com/ruoyi/upload/service/FileService.java | 13 +++ .../upload/service/impl/FileServiceImpl.java | 81 +++++++++++++++++ .../controller/common/CommonController.java | 28 ++++-- .../web/controller/cos/CosStsController.java | 36 -------- .../src/main/resources/application.yml | 55 ++--------- .../com/ruoyi/common/config/OssConfig.java | 23 +++++ .../com/ruoyi/common/utils/AliOssUtil.java | 51 +++++++++++ .../ruoyi/system/service/CosStsService.java | 82 ----------------- dl_vue/src/components/ImageUpload/index.vue | 91 ++++++------------- dl_vue/src/utils/request.js | 4 +- 13 files changed, 280 insertions(+), 261 deletions(-) create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java create mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java delete mode 100644 dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java create mode 100644 dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java create mode 100644 dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java delete mode 100644 dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java diff --git a/dl_admin/pom.xml b/dl_admin/pom.xml index 3419081..d00aa9b 100644 --- a/dl_admin/pom.xml +++ b/dl_admin/pom.xml @@ -37,6 +37,8 @@ 5.3.39 5.8.26 3.5.1 + 3.17.4 + 4.5.13 @@ -229,7 +231,18 @@ ruoyi-common ${ruoyi.version} - + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.sdk.oss.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + diff --git a/dl_admin/ruoyi-admin/pom.xml b/dl_admin/ruoyi-admin/pom.xml index 544ff2b..2648350 100644 --- a/dl_admin/ruoyi-admin/pom.xml +++ b/dl_admin/ruoyi-admin/pom.xml @@ -16,6 +16,18 @@ + + + com.aliyun.oss + aliyun-sdk-oss + 3.17.4 + + + + commons-io + commons-io + 2.4 + @@ -106,7 +118,16 @@ weixin-java-common 4.6.0 - + + + com.aliyun.oss + aliyun-sdk-oss + + + + org.apache.httpcomponents + httpclient + diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java index b0c1d9a..8b908b0 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/ueditorConfig/UeditorController.java @@ -2,8 +2,10 @@ package com.ruoyi.ueditorConfig; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.framework.config.ServerConfig; +import com.ruoyi.web.controller.common.CommonController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,9 +31,11 @@ public class UeditorController { @Autowired private ServerConfig serverConfig; + @Autowired + private CommonController commonController; @RequestMapping(value = "/exec") - public String config(HttpServletRequest request, HttpServletResponse response, String action, MultipartFile[] upfile) throws IOException { + public String config(HttpServletRequest request, HttpServletResponse response, String action, MultipartFile[] upfile) throws Exception { if (action.equals("config")) { request.setCharacterEncoding("utf-8"); response.setHeader("Content-Type", "text/html"); @@ -43,42 +47,33 @@ public class UeditorController { } else if (action.equals("uploadimage")) { Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub= " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } return null; }else if(action.equals("uploadvideo")){ Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub = " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } }else{ Map result = new HashMap(); for (MultipartFile multipartFile : upfile) { - String upload = FileUploadUtils.upload(RuoYiConfig.getUploadPath(),multipartFile); - System.out.println("upload = " + upload); - System.out.println("upload.sub= " + upload.substring(upload.lastIndexOf("/"))); - result.put("title", upload.substring(upload.lastIndexOf("/")+1)); + AjaxResult ajaxResult = commonController.uploadFile(multipartFile); + result.put("title", multipartFile.getOriginalFilename()); result.put("original", multipartFile.getOriginalFilename()); result.put("state", "SUCCESS"); - result.put("url", serverConfig.getUrl()+upload); - String jStr = JSON.toJSONString(result); - return jStr; + result.put("url", ajaxResult.get("url")); + return JSON.toJSONString(result); } } return null; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java new file mode 100644 index 0000000..076317d --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/FileService.java @@ -0,0 +1,13 @@ +package com.ruoyi.upload.service; + +import org.springframework.web.multipart.MultipartFile; + +public interface FileService { + /** + * 阿里云OSS文件上传 + * @param file + * @return + */ + String upload(MultipartFile file); + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..defbadd --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/upload/service/impl/FileServiceImpl.java @@ -0,0 +1,81 @@ +package com.ruoyi.upload.service.impl; + +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.PutObjectResult; +import com.ruoyi.common.config.OssConfig; +import com.ruoyi.upload.service.FileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.UUID; + +/** + * 文件上传业务类 + * + * @author lixiang + */ +@Service +@Slf4j +public class FileServiceImpl implements FileService { + @Autowired + private OssConfig ossConfig; + /** + * 阿里云OSS文件上传 + * + * @param file + * @return + */ + @Override + public String upload(MultipartFile file) { + //获取相关配置 + String bucketName = ossConfig.getBucketName(); + String endPoint = ossConfig.getEndPoint(); + String accessKeyId = ossConfig.getAccessKeyId(); + String accessKeySecret = ossConfig.getAccessKeySecret(); + + //创建OSS对象 + OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret); + + //获取原生文件名 + String originalFilename = file.getOriginalFilename(); + //JDK8的日期格式 + LocalDateTime time = LocalDateTime.now(); + DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd"); + + //拼装OSS上存储的路径 + String folder = dft.format(time); + String fileName = generateUUID(); + String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + + //在OSS上bucket下的文件名 + String uploadFileName = "user/" + folder + "/" + fileName + extension; + + try { + PutObjectResult result = ossClient.putObject(bucketName, uploadFileName, file.getInputStream()); + //拼装返回路径 + if (result != null) { + return "https://"+bucketName+"."+endPoint+"/"+uploadFileName; + } + } catch (IOException e) { + log.error("文件上传失败:{}",e.getMessage()); + } finally { + //OSS关闭服务,不然会造成OOM + ossClient.shutdown(); + } + return null; + } + + /** + * 获取随机字符串 + * @return + */ + private String generateUUID() { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); + } +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java index cec5006..8d86711 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java @@ -4,6 +4,9 @@ import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.system.service.ISysConfigService; +import com.ruoyi.upload.service.FileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,6 +37,10 @@ public class CommonController @Autowired private ServerConfig serverConfig; + @Autowired + private ISysConfigService sysConfigService; + @Autowired + private FileService fileService; private static final String FILE_DELIMETER = ","; @@ -79,13 +86,22 @@ public class CommonController { // 上传文件路径 String filePath = RuoYiConfig.getUploadPath(); - // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); - ajax.put("url", url); - ajax.put("fileName", fileName); - ajax.put("newFileName", FileUtils.getName(fileName)); + // 上传并返回新文件名称 + String uploadType = sysConfigService.selectConfigByKey("uploadType"); + if ("local".equals(uploadType)){ + //本地上传方式 + String fileName = FileUploadUtils.upload(filePath, file); + String url = serverConfig.getUrl() + fileName; + ajax.put("url", url); + ajax.put("fileName", fileName); + ajax.put("newFileName", FileUtils.getName(fileName)); + }else if ("aliOss".equals(uploadType)){ + //阿里oss上传方式 + String fileUrl = fileService.upload(file); + ajax.put("url", fileUrl); + ajax.put("fileName", fileUrl); + } ajax.put("originalFilename", file.getOriginalFilename()); return ajax; } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java deleted file mode 100644 index 529f860..0000000 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/web/controller/cos/CosStsController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ruoyi.web.controller.cos; - -import com.ruoyi.system.service.CosStsService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.security.PermitAll; -import java.util.Map; - -/** - * @Description: sts - * @Author: 86187 - * @Date: 2025/03/20 16:34 - * @Version: 1.0 - */ -@RestController -@RequestMapping("/cos") -@RequiredArgsConstructor -public class CosStsController { - - private final CosStsService cosStsService; - - /** - * 获取cos临时密钥 - * - * @return sts - */ - @GetMapping("/sts") - @PermitAll - public Map getCosSts() { - return cosStsService.getTempKeys(); - } -} diff --git a/dl_admin/ruoyi-admin/src/main/resources/application.yml b/dl_admin/ruoyi-admin/src/main/resources/application.yml index 5c411b6..8af7ed4 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application.yml @@ -143,51 +143,12 @@ xss: excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* -# 微信小程序配置----多点通告 -wx-app: - appId: wxd96fda6510adb6d3 - appSecret: 2d3bf7172d09966bd98e1611117c2cb0 - token: tgxcxtoken - aesKey: afBZchk5wSFaldDkZB9DZ9Ib6JUV4NwMARaRThsRFqQ - msgDataFormat: XML -wxpay: - #微信公众号appid - appId: wx7d10b0fa4886a583 - #商户号 - mchId: 1712447936 - #商户密匙v2 - mchKey: ab94673dd0cca78abd0a453d0aac9f98 - # APIv3密钥 - apiV3Key: ab94673dd0cca78abd0a453d0aac9f98 - #微信支付p12证书 - keyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_cert.p12 - # 微信支付V3-url前缀 - baseUrl: https://api.mch.weixin.qq.com/v3 - # 支付通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - notifyUrl: https://3w823u8516.vicp.fun/noticeApi/payApi/payNotify - # 转账通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - zhuanNotifyUrl: https://3w823u8516.vicp.fun/noticeApi/payApi/zhuanNotify - # 退款通知回调, pjm6m9.natappfree.cc 为内网穿透地址 - refundNotifyUrl: https://www.ddtg.site/notice/notify/refundNotify - # 密钥路径,resources根目录下 - privateKeyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_key.pem - privateCertPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/apiclient_cert.pem - publicKeyPath: D:/任务平台项目/dl_admin/ruoyi-admin/src/main/resources/pub_key.pem - #商户证书序列号 - serialNo: 7FCDB0E72D6A928013361ACB77FA3F0DCBD370E3 - publicKeyId: PUB_KEY_ID_0117124479362025041500321584003200 - wxAppSecret: 1515e5d055e8dabf5b30faad14ccbc8d +# 阿里云OSS配置 +aliyun: + oss: + end-point: oss-cn-qingdao.aliyuncs.com + access-key-id: LTAI5tLThQFWgMLRTf3siNjb + access-key-secret: M5HjOyB8ir5tYEPFOQwImfJNgsumaG + bucket-name: dianliang123 + -# 普通用户权益值 -dl-rights: -# 每月发布通告额度 - addNotice: 3 - report: 5 - #################### 腾讯COS相关配置 #################### -cos: - baseUrl: notice-1348525010.cos.ap-beijing.myqcloud.com - accessKey: AKIDDbyY3Wr9D4i9LK6f085pLfleJlz60hAP - secretKey: 82kJfnu11ulW5TghV5TecVYP3TghXAZl - regionName: ap-beijing - bucketName: notice-1348525010 - folderPrefix: /files diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java new file mode 100644 index 0000000..38706df --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/config/OssConfig.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @description OSS配置类 + * @author lixiang + */ +@ConfigurationProperties(prefix = "aliyun.oss") +@Configuration +@Data +public class OssConfig { + private String endPoint; + private String accessKeyId; + private String accessKeySecret; + private String bucketName; + + +} diff --git a/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java new file mode 100644 index 0000000..86a7388 --- /dev/null +++ b/dl_admin/ruoyi-common/src/main/java/com/ruoyi/common/utils/AliOssUtil.java @@ -0,0 +1,51 @@ +//package com.ruoyi.common.utils; +///** +// * 图像上传工具类 +// */ +//public class AliOssUtil { +// +// +// /** +// * 上传文件到阿里云OSS +// * +// * @param file 要上传的文件 +// * @return 返回上传后的文件URL +// * @throws IOException 如果文件处理过程中发生IO异常 +// */ +// public static String upload(MultipartFile file) throws IOException { +// // 获取文件原始名称 +// String origName = file.getOriginalFilename(); +// // 获取文件扩展名 +// String ext = FilenameUtils.getExtension(origName); +// // 生成UUID作为文件名 +// String uuid = UUID.randomUUID().toString().replace("-", ""); +// String fileName = uuid + "." + ext; +// +// // 阿里云OSS配置信息 +// String endpoint = "https://xxxx.aliyuncs.com"; +// String accessKeyId = "xxxxxxxxxxxxxxxxxxxx"; +// String accessKeySecret = "xxxxxxxxxxxxxxxxxxxxxxx"; +// String bucketName = "仓库名"; +// +// // 创建OSS客户端 +// OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); +// +// try { +// // 将文件上传到OSS +// InputStream is = file.getInputStream(); +// ossClient.putObject(bucketName, fileName, is); +// } catch (Exception e) { +// // 异常处理 +// e.printStackTrace(); +// throw new IOException("上传文件到OSS失败", e); +// } finally { +// // 关闭OSS客户端 +// if (ossClient != null) { +// ossClient.shutdown(); +// } +// } +// +// // 返回上传后的文件URL +// return ALI_DOMAIN + fileName; +// } +//} diff --git a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java b/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java deleted file mode 100644 index 7570b14..0000000 --- a/dl_admin/ruoyi-system/src/main/java/com/ruoyi/system/service/CosStsService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.ruoyi.system.service; - -import com.tencent.cloud.CosStsClient; -import com.tencent.cloud.Response; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; -import java.util.TreeMap; - -/** - * @Description: sts - * @Author: 86187 - * @Date: 2025/03/20 16:18 - * @Version: 1.0 - */ -@Service -public class CosStsService { - // 你的腾讯云账号的 SecretId 和 SecretKey - @Value("${cos.accessKey}") - private String SECRET_ID; - @Value("${cos.secretKey}") - private String SECRET_KEY; - - // 存储桶所属的地域,例如 "ap-shanghai" - @Value("${cos.regionName}") - private String REGION; - - // 你的存储桶名,例如 "example-1250000000" - @Value("${cos.bucketName}") - private String BUCKET; - - // 临时密钥有效期(单位秒),最长不超过 2 小时(7200 秒) - private static final int DURATION_SECONDS = 1800; - - public Map getTempKeys() { - TreeMap config = new TreeMap(); - - try { - // 云 api 密钥 SecretId - config.put("secretId", SECRET_ID); - // 云 api 密钥 SecretKey - config.put("secretKey", SECRET_KEY); - // 临时密钥有效时长,单位是秒 - config.put("durationSeconds", 1800); - // 换成你的 bucket - config.put("bucket", BUCKET); - // 换成 bucket 所在地区 - config.put("region", REGION); - - // 可以通过 allowPrefixes 指定前缀数组, 例子: a.jpg 或者 a/* 或者 * (使用通配符*存在重大安全风险, 请谨慎评估使用) - config.put("allowPrefixes", new String[] { - "*" - }); - - // 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923 - String[] allowActions = new String[] { - // 简单上传 - "name/cos:PutObject", - "name/cos:PostObject", - // 分片上传 - "name/cos:InitiateMultipartUpload", - "name/cos:ListMultipartUploads", - "name/cos:ListParts", - "name/cos:UploadPart", - "name/cos:CompleteMultipartUpload" - }; - config.put("allowActions", allowActions); - - Response response = CosStsClient.getCredential(config); - Map result= new HashMap<>(); - result.put("credentials", response.credentials); - result.put("startTime", response.startTime); - result.put("expiredTime", response.expiredTime); - return result; - } catch (Exception e) { - e.printStackTrace(); - throw new IllegalArgumentException("no valid secret !"); - } - } -} diff --git a/dl_vue/src/components/ImageUpload/index.vue b/dl_vue/src/components/ImageUpload/index.vue index f32c311..173e741 100644 --- a/dl_vue/src/components/ImageUpload/index.vue +++ b/dl_vue/src/components/ImageUpload/index.vue @@ -2,18 +2,21 @@
@@ -41,7 +44,7 @@ - + + diff --git a/dl_vue/src/utils/request.js b/dl_vue/src/utils/request.js index 323cd94..fb6c23d 100644 --- a/dl_vue/src/utils/request.js +++ b/dl_vue/src/utils/request.js @@ -40,7 +40,9 @@ service.interceptors.request.use(config => { } if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) { //拼接当前管理的站点code - config.data.tenantId = getTenantId() + if(config.data){ + config.data.tenantId = getTenantId() + } const requestObj = { url: config.url, data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,