ruoyi-modules/ruoyi-member/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-modules/ruoyi-member/src/main/resources/logback.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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> 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(); } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/FileUploadUtils.java
New file @@ -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; } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/util/OBSUploadUtils.java
New file @@ -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; } } 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" />