From ea34290f58ef05c9b6705ee7229de431c0a7d80d Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期一, 22 九月 2025 21:37:14 +0800 Subject: [PATCH] 修改bug --- ruoyi-modules/ruoyi-member/src/main/resources/logback.xml | 2 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java | 7 ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java | 212 ++++++++++++++++++++++++++++++ ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java | 186 ++++++++++++++++++++++++++ ruoyi-modules/ruoyi-member/pom.xml | 13 + 5 files changed, 415 insertions(+), 5 deletions(-) diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index e40bb96..455f731 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -149,6 +149,19 @@ <version>3.6.2</version> <scope>compile</scope> </dependency> + + <!-- 阿里云OBS --> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + <version>3.15.1</version> + </dependency> + + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>core</artifactId> + <version>3.5.1</version> + </dependency> </dependencies> <build> diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java index 3a2ff61..cb86e67 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java @@ -31,6 +31,7 @@ import com.ruoyi.member.service.member.MemberTotalService; import com.ruoyi.member.util.HttpUtils; import com.ruoyi.member.util.MsgUtils; +import com.ruoyi.member.util.OBSUploadUtils; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.constant.SecurityConstant; import com.ruoyi.system.api.domain.dto.*; @@ -2356,10 +2357,8 @@ public String getWeiXinQrCode(String scene, String path) { try { File file = wxMaService.getQrcodeService().createWxaCodeUnlimit(scene, path); - FileInputStream input = new FileInputStream(file); - MultipartFile multipartFile = new MyMultipartFile("file", file.getName(), "text/plain", IOUtils.toByteArray(input)); - String data = remoteFileService.uploadOSS(multipartFile).getData(); - return data; + String url = OBSUploadUtils.uploadLocalFile(file); + return url; } catch (Exception e) { e.printStackTrace(); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java new file mode 100644 index 0000000..ccfea9f --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java @@ -0,0 +1,186 @@ +package com.ruoyi.member.util; + +import com.ruoyi.common.core.exception.file.FileException; +import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException; +import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException; +import com.ruoyi.common.core.exception.file.InvalidExtensionException; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.StringUtils; +import com.ruoyi.common.core.utils.file.FileTypeUtils; +import com.ruoyi.common.core.utils.file.MimeTypeUtils; +import com.ruoyi.common.core.utils.uuid.Seq; +import org.apache.commons.io.FilenameUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Objects; + +/** + * 文件上传工具类 + * + * @author jqs + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException + { + try + { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } + catch (FileException fe) + { + throw new IOException(fe.getDefaultMessage(), fe); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException + { + int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) + { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); + file.transferTo(Paths.get(absPath)); + return getPathFileName(fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), + FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file)); + } + + private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc.isAbsolute() ? desc : desc.getAbsoluteFile(); + } + + private static final String getPathFileName(String fileName) throws IOException + { + String pathFileName = "/" + fileName; + return pathFileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = FileTypeUtils.getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension 上传文件类型 + * @param allowedExtension 允许上传文件类型 + * @return true/false + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java new file mode 100644 index 0000000..ba70bee --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java @@ -0,0 +1,212 @@ +package com.ruoyi.member.util; + +import cn.hutool.extra.qrcode.QrCodeUtil; +import com.aliyun.oss.ClientException; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.OSSException; +import com.aliyun.oss.model.OSSObject; +import com.aliyun.oss.model.PutObjectRequest; +import com.aliyun.oss.model.PutObjectResult; +import com.ruoyi.common.core.utils.uuid.IdUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.Calendar; +import java.util.Date; + +/** + * @author jqs34 + * @version 1.0 + * @classname OBSUploadUtils + * @description: TODO + * @date 2023 2023/5/1 15:40 + */ +public class OBSUploadUtils { + + + + public static void main(String[] args) throws Exception { + String fileUrl = null; + File qrCodeFile = new File("/home/image/qrcode.png"); + // 二维码内容 + String text = "https://wxapp.hhhrt.cn/mini/coupon"; + // 生成二维码 + QrCodeUtil.generate(text, 100, 100, qrCodeFile); + InputStream codeStream = new FileInputStream(qrCodeFile); + fileUrl = OBSUploadUtils.uploadInputStream(codeStream,"couponCode"); + System.out.println(fileUrl); + } + + protected static OSS createOss(){ + // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。 + String endpoint = "https://oss-cn-beijing.aliyuncs.com"; + // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 + String accessKeyId = "LTAI5tAfKFuhyKFH12CTkXFj"; + String accessKeySecret = "tIBRuonHuQQPdcYrmlCdXlexOSwVXe"; + // 填写Bucket名称,例如examplebucket。 + String bucketName = "hongruitang"; + OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); + return ossClient; + } + + public static String uploadFile (MultipartFile file) throws Exception { + + // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 + String bucketName = "hongruitang"; + Calendar calendar = Calendar.getInstance(); + // 获取当前年 + String year = String.valueOf(calendar.get(Calendar.YEAR)); + // 获取当前月 + String month = String.valueOf(calendar.get(Calendar.MONTH) + 1); + // 获取当前日 + String day = String.valueOf(calendar.get(Calendar.DATE)); + String filePath = year+"/"+month+"/"+day+"/"; + String uuid = IdUtils.fastSimpleUUID(); + // 创建OSSClient实例。 + OSS ossClient = createOss(); + PutObjectResult result = null; + try { + String fileName = FileUploadUtils.extractFilename(file); + System.out.println(fileName + "开始上传" + new Date()); + String prefix = fileName.substring(fileName.lastIndexOf(".")); + String objectName = filePath + uuid + prefix; + InputStream inputStream = file.getInputStream(); + // 创建PutObjectRequest对象。 + PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); + // 设置该属性可以返回response。如果不设置,则返回的response为空。 + putObjectRequest.setProcess("true"); + // 创建PutObject请求。 + result = ossClient.putObject(putObjectRequest); + // 如果上传成功,则返回200。 + System.out.println(fileName + "上传返回"+ new Date() + result.getResponse().getStatusCode()); + inputStream.close(); + return result.getResponse().getUri(); + } catch (OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + System.out.println("Error Message:" + oe.getErrorMessage()); + System.out.println("Error Code:" + oe.getErrorCode()); + System.out.println("Request ID:" + oe.getRequestId()); + System.out.println("Host ID:" + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message:" + ce.getMessage()); + } finally { + if (ossClient != null) { + ossClient.shutdown(); + } + } + return result.getResponse().getErrorResponseAsString(); + } + + public static String uploadInputStream (InputStream inputStream,String fileName) throws Exception { + + // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 + String bucketName = "hongruitang"; + Calendar calendar = Calendar.getInstance(); + // 获取当前年 + String year = String.valueOf(calendar.get(Calendar.YEAR)); + // 获取当前月 + String month = String.valueOf(calendar.get(Calendar.MONTH) + 1); + // 获取当前日 + String day = String.valueOf(calendar.get(Calendar.DATE)); + String filePath = year+"/"+month+"/"+day+"/"; + String uuid = IdUtils.fastSimpleUUID(); + // 创建OSSClient实例。 + OSS ossClient = createOss(); + PutObjectResult result = null; + try { + + System.out.println(fileName + "开始上传"+ new Date()); + String objectName = filePath + fileName + ".jpg"; + // 创建PutObjectRequest对象。 + PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream); + // 设置该属性可以返回response。如果不设置,则返回的response为空。 + putObjectRequest.setProcess("true"); + // 创建PutObject请求。 + result = ossClient.putObject(putObjectRequest); + // 如果上传成功,则返回200。 + System.out.println(fileName + "上传返回"+ new Date() + result.getResponse().getStatusCode()); + return result.getResponse().getUri(); + } catch (OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + System.out.println("Error Message:" + oe.getErrorMessage()); + System.out.println("Error Code:" + oe.getErrorCode()); + System.out.println("Request ID:" + oe.getRequestId()); + System.out.println("Host ID:" + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message:" + ce.getMessage()); + } finally { + if (ossClient != null) { + ossClient.shutdown(); + } + } + return result.getResponse().getErrorResponseAsString(); + } + + public static String uploadLocalFile (File file) throws Exception { + + // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。 + String bucketName = "hongruitang"; + Calendar calendar = Calendar.getInstance(); + // 获取当前年 + String year = String.valueOf(calendar.get(Calendar.YEAR)); + // 获取当前月 + String month = String.valueOf(calendar.get(Calendar.MONTH) + 1); + // 获取当前日 + String day = String.valueOf(calendar.get(Calendar.DATE)); + String filePath = year+"/"+month+"/"+day+"/"; + String uuid = IdUtils.fastSimpleUUID(); + // 创建OSSClient实例。 + OSS ossClient = createOss(); + PutObjectResult result = null; + try { + + String fileName =file.getName(); + System.out.println(fileName + "开始上传"); + String prefix = fileName.substring(fileName.lastIndexOf(".")); + String objectName = filePath + uuid + prefix; + // 创建PutObject请求。 + result = ossClient.putObject(bucketName,objectName,file); + // 如果上传成功,则返回200。 + System.out.println(fileName + "上传返回" + result.getResponse().getStatusCode()); + return result.getResponse().getUri(); + } catch (OSSException oe) { + System.out.println("Caught an OSSException, which means your request made it to OSS, " + + "but was rejected with an error response for some reason."); + System.out.println("Error Message:" + oe.getErrorMessage()); + System.out.println("Error Code:" + oe.getErrorCode()); + System.out.println("Request ID:" + oe.getRequestId()); + System.out.println("Host ID:" + oe.getHostId()); + } catch (ClientException ce) { + System.out.println("Caught an ClientException, which means the client encountered " + + "a serious internal problem while trying to communicate with OSS, " + + "such as not being able to access the network."); + System.out.println("Error Message:" + ce.getMessage()); + } finally { + if (ossClient != null) { + ossClient.shutdown(); + } + } + return result.getResponse().getErrorResponseAsString(); + } + + public static InputStream getOSSInputStream(String key) throws Exception { + String bucketName = "hongruitang"; + // 创建OSSClient实例。 + OSS ossClient = createOss(); + OSSObject ossObject = ossClient.getObject(bucketName,key); + InputStream inputStream = ossObject.getObjectContent(); + return inputStream; + } + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/logback.xml b/ruoyi-modules/ruoyi-member/src/main/resources/logback.xml index 7691358..68c3a0e 100644 --- a/ruoyi-modules/ruoyi-member/src/main/resources/logback.xml +++ b/ruoyi-modules/ruoyi-member/src/main/resources/logback.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 日志存放路径 --> - <property name="log.path" value="logs/ruoyi-member" /> + <property name="log.path" value="/opt/logs/member" /> <!-- 日志输出格式 --> <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /> -- Gitblit v1.7.1