pudongliang пре 5 година
родитељ
комит
88777d932d
18 измењених фајлова са 389 додато и 108 уклоњено
  1. 1 2
      README.md
  2. 30 0
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/FileController.java
  3. 0 6
      fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/HomeController.java
  4. 0 5
      fw-sample-rpc/src/main/java/com/xc/srm/rpc/SampleRpcService.java
  5. 1 1
      fw-sample-service/pom.xml
  6. 1 3
      fw-sample-service/src/main/java/com/mokasz/sample/common/config/XxlSsoConfig.java
  7. 51 0
      fw-sample-service/src/main/java/com/mokasz/sample/common/constant/MimeTypeConstant.java
  8. 0 65
      fw-sample-service/src/main/java/com/mokasz/sample/common/event/ExceptionDelayQueueEvent.java
  9. 1 3
      fw-sample-service/src/main/java/com/mokasz/sample/common/interceptor/LogCglibInterceptor.java
  10. 1 3
      fw-sample-service/src/main/java/com/mokasz/sample/common/interceptor/LogProxyInvocationHandler.java
  11. 0 4
      fw-sample-service/src/main/java/com/mokasz/sample/common/model/CsvModel.java
  12. 0 3
      fw-sample-service/src/main/java/com/mokasz/sample/common/model/DataModel.java
  13. 0 5
      fw-sample-service/src/main/java/com/mokasz/sample/common/model/DownloadData.java
  14. 0 3
      fw-sample-service/src/main/java/com/mokasz/sample/common/model/PageVO.java
  15. 0 5
      fw-sample-service/src/main/java/com/mokasz/sample/common/model/UploadData.java
  16. 32 0
      fw-sample-service/src/main/java/com/mokasz/sample/common/properties/OssConfig.java
  17. 72 0
      fw-sample-service/src/main/java/com/mokasz/sample/common/util/OssUtils.java
  18. 199 0
      fw-sample-service/src/main/java/com/mokasz/sample/manager/OssClient.java

+ 1 - 2
README.md

@@ -40,8 +40,7 @@
 			ds                      //数据源
 			convert                 //map struct
 			event                   //spring application event
-			emokaszeption               //自定义异常
-			redis                   //redisson client
+			exception               //自定义异常
 			interceptor             //拦截器
 			properties              //配置项对象
 			model                   //通用模型

+ 30 - 0
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/FileController.java

@@ -0,0 +1,30 @@
+package com.mokasz.sample.admin.controller;
+
+import com.mokasz.sample.common.model.ApiResponse;
+import com.mokasz.sample.manager.OssClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件上传阿里云OSS
+ */
+@RestController
+@RequestMapping("/admin/file")
+@Slf4j
+public class FileController {
+
+    @Autowired
+    private OssClient ossService;
+
+    @PostMapping("/upload")
+    public ApiResponse<String> upload(@RequestParam("file") MultipartFile file) {
+        String fileUrl = ossService.upload(file);
+        return ApiResponse.ok(fileUrl);
+    }
+
+}

+ 0 - 6
fw-sample-admin/src/main/java/com/mokasz/sample/admin/controller/HomeController.java

@@ -19,12 +19,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 
-/**
- * Controller
- *
- * @author yyb
- * @date 2021-06-24 09:23:35
- */
 @Api(tags = "后台用户")
 @Slf4j
 @Validated

+ 0 - 5
fw-sample-rpc/src/main/java/com/xc/srm/rpc/SampleRpcService.java

@@ -3,11 +3,6 @@ package com.xc.srm.rpc;
 import com.xc.srm.rpc.query.SampleRpcQuery;
 import com.xc.srm.rpc.vo.SampleRpcVO;
 
-/**
- * 示例dubbo rpc 接口
- *
- * @author yinyansheng
- */
 public interface SampleRpcService {
     SampleRpcVO hello(SampleRpcQuery sampleRpcQuery);
 }

+ 1 - 1
fw-sample-service/pom.xml

@@ -53,7 +53,7 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>5.2.3</version>
+            <version>5.5.9</version>
         </dependency>
 
         <!-- Java Bean和JSON字符串相互转换 -->

+ 1 - 3
fw-sample-service/src/main/java/com/mokasz/sample/common/config/XxlSsoConfig.java

@@ -10,9 +10,7 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-/**
- * @author xuxueli 2018-11-15
- */
+
 @Configuration
 @ConfigurationProperties(prefix = "xxl.sso")
 public class XxlSsoConfig implements DisposableBean {

+ 51 - 0
fw-sample-service/src/main/java/com/mokasz/sample/common/constant/MimeTypeConstant.java

@@ -0,0 +1,51 @@
+package com.mokasz.sample.common.constant;
+
+/**
+ * @author ljj12094
+ */
+public class MimeTypeConstant {
+
+    public static final String IMAGE_PNG = "image/png";
+
+    public static final String IMAGE_JPG = "image/jpg";
+
+    public static final String IMAGE_JPEG = "image/jpeg";
+
+    public static final String IMAGE_BMP = "image/bmp";
+
+    public static final String IMAGE_GIF = "image/gif";
+
+    public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"};
+
+    public static final String[] FLASH_EXTENSION = {"swf", "flv"};
+
+    public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
+            "asf", "rm", "rmvb"};
+
+    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
+            // 图片
+            "bmp", "gif", "jpg", "jpeg", "png",
+            // word excel powerpoint
+            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
+            // 压缩文件
+            "rar", "zip", "gz", "bz2",
+            // pdf
+            "pdf"};
+
+    public static String geByPrefix(String prefix) {
+        switch (prefix) {
+            case IMAGE_PNG:
+                return "png";
+            case IMAGE_JPG:
+                return "jpg";
+            case IMAGE_JPEG:
+                return "jpeg";
+            case IMAGE_BMP:
+                return "bmp";
+            case IMAGE_GIF:
+                return "gif";
+            default:
+                return "";
+        }
+    }
+}

+ 0 - 65
fw-sample-service/src/main/java/com/mokasz/sample/common/event/ExceptionDelayQueueEvent.java

@@ -1,65 +0,0 @@
-package com.mokasz.sample.common.event;
-
-import com.alibaba.excel.util.DateUtils;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.concurrent.Delayed;
-import java.util.concurrent.TimeUnit;
-
-@Data
-@EqualsAndHashCode
-public class ExceptionDelayQueueEvent implements Delayed {
-
-    public ExceptionDelayQueueEvent(String className) {
-        this.className = className;
-        this.title = className;
-        this.alarmCount = 1;
-        this.alarmTime = getLatelyTime(new Date());
-    }
-
-    public ExceptionDelayQueueEvent(String className, String title, String msg) {
-        this.className = className;
-        this.title = title;
-        this.msg = msg;
-        this.alarmCount = 1;
-        this.alarmTime = getLatelyTime(new Date());
-    }
-
-    private String className;
-
-    @EqualsAndHashCode.Exclude
-    private String title;
-
-    @EqualsAndHashCode.Exclude
-    private Integer alarmCount;
-
-    @EqualsAndHashCode.Exclude
-    private long alarmTime;
-
-    @EqualsAndHashCode.Exclude
-    private String msg;
-
-    @Override
-    public long getDelay(TimeUnit unit) {
-        return unit.convert(this.alarmTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
-    }
-
-    @Override
-    public int compareTo(Delayed o) {
-        return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
-    }
-
-    public static long getLatelyTime(Date date) {
-        Calendar calendar = Calendar.getInstance();
-        calendar.setTime(date);
-        calendar.set(Calendar.MINUTE, (calendar.get(Calendar.MINUTE)) / 10 * 10);
-        calendar.set(Calendar.SECOND, 0);
-        calendar.add(Calendar.MINUTE, 10);
-        Date late = calendar.getTime();
-        return late.getTime();
-    }
-}

+ 1 - 3
fw-sample-service/src/main/java/com/mokasz/sample/common/interceptor/LogCglibInterceptor.java

@@ -10,9 +10,7 @@ import java.lang.reflect.Method;
 import java.time.Duration;
 import java.time.Instant;
 
-/**
- * @author yinyansheng
- */
+
 @Slf4j
 public class LogCglibInterceptor implements MethodInterceptor {
 

+ 1 - 3
fw-sample-service/src/main/java/com/mokasz/sample/common/interceptor/LogProxyInvocationHandler.java

@@ -8,9 +8,7 @@ import java.lang.reflect.Method;
 import java.time.Duration;
 import java.time.Instant;
 
-/**
- * @author yinyansheng
- */
+
 @Slf4j
 public class LogProxyInvocationHandler implements InvocationHandler {
 

+ 0 - 4
fw-sample-service/src/main/java/com/mokasz/sample/common/model/CsvModel.java

@@ -6,10 +6,6 @@ import lombok.Setter;
 
 import java.lang.reflect.Field;
 
-/**
- * @author wuhan
- * @date 2020/2/24
- **/
 @Getter
 @Setter
 @AllArgsConstructor

+ 0 - 3
fw-sample-service/src/main/java/com/mokasz/sample/common/model/DataModel.java

@@ -4,9 +4,6 @@ import lombok.Data;
 
 import java.util.List;
 
-/**
- * @author dxl
- */
 @Data
 public class DataModel<T> {
     T dataTotal;

+ 0 - 5
fw-sample-service/src/main/java/com/mokasz/sample/common/model/DownloadData.java

@@ -5,11 +5,6 @@ import lombok.Data;
 
 import java.util.Date;
 
-/**
- * 基础数据类
- *
- * @author Jiaju Zhuang
- **/
 @Data
 public class DownloadData {
     @ExcelProperty("字符串标题")

+ 0 - 3
fw-sample-service/src/main/java/com/mokasz/sample/common/model/PageVO.java

@@ -10,9 +10,6 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 import java.util.List;
 
-/**
- * @author yinyansheng
- */
 @ApiModel(value = "分页返回类")
 @Data
 @Builder

+ 0 - 5
fw-sample-service/src/main/java/com/mokasz/sample/common/model/UploadData.java

@@ -4,11 +4,6 @@ import lombok.Data;
 
 import java.util.Date;
 
-/**
- * 基础数据类
- *
- * @author Jiaju Zhuang
- **/
 @Data
 public class UploadData {
     private String string;

+ 32 - 0
fw-sample-service/src/main/java/com/mokasz/sample/common/properties/OssConfig.java

@@ -0,0 +1,32 @@
+package com.mokasz.sample.common.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author ljj12094
+ */
+@Configuration
+@ConfigurationProperties(prefix = "hyperion.oss")
+@Data
+public class OssConfig {
+
+    /**
+     * yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
+     */
+    private String endpoint = "http://oss-cn-shanghai.aliyuncs.com";
+
+    /**
+     * 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
+     */
+    private String accessKeyId = "LTAI5tGN7nZttKEcZKuG453b";
+
+    private String accessKeySecret = "dWS14pwRd3Q1x4EvEUwNuc39GsXahr";
+
+    private String bucketName = "free-novel-test";
+
+    private String domain = "https://free-novel-test.mokamrp.com";
+
+}
+

+ 72 - 0
fw-sample-service/src/main/java/com/mokasz/sample/common/util/OssUtils.java

@@ -0,0 +1,72 @@
+package com.mokasz.sample.common.util;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import com.mokasz.sample.common.constant.MimeTypeConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.ResourceUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.util.Date;
+
+/**
+ * 文件上传工具类
+ *
+ * @author ljj12094
+ */
+@Slf4j
+public class OssUtils {
+
+    /**
+     * 上传
+     *
+     * @param file   文件内容
+     * @param domain 文件访问域名
+     * @param path   文件保存路径
+     * @return 文件地址
+     */
+    public static String upload(MultipartFile file, String domain, String path) {
+        String filename;
+
+        try {
+            filename = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN) + getExtension(file, true);
+            String filePath = ResourceUtils.getURL("classpath:").getPath() + path;
+
+            File dest = new File(filePath, filename);
+            // 拷贝文件到指定路径储存
+            file.transferTo(dest);
+        } catch (Exception e) {
+            log.error("上传失败", e);
+            return null;
+        }
+
+        return String.format("http://%s/%s/%s", domain, path, filename);
+    }
+
+    /**
+     * 获取文件名的后缀
+     *
+     * @param file      表单文件
+     * @param withPoint 是否带"。"
+     * @return 后缀名
+     */
+    public static String getExtension(MultipartFile file, boolean withPoint) {
+        if (null == file) {
+            return "";
+        }
+
+        String fileName = StringUtils.isEmpty(file.getOriginalFilename()) ? file.getName() : file.getOriginalFilename();
+        String extension = FileUtil.extName(fileName);
+
+        if (StringUtils.isEmpty(extension) && StringUtils.isNotBlank(file.getContentType())) {
+            extension = MimeTypeConstant.geByPrefix(file.getContentType());
+        }
+
+        extension = withPoint ? "." + extension : extension;
+        return StringUtils.lowerCase(extension);
+    }
+
+}

+ 199 - 0
fw-sample-service/src/main/java/com/mokasz/sample/manager/OssClient.java

@@ -0,0 +1,199 @@
+package com.mokasz.sample.manager;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.DownloadFileRequest;
+import com.aliyun.oss.model.DownloadFileResult;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.mokasz.sample.common.properties.OssConfig;
+import com.mokasz.sample.common.util.OssUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * OSS 文件上传服务
+ *
+ * @author ljj12094
+ */
+@Service
+@Slf4j
+public class OssClient {
+
+    @Autowired
+    private OssConfig ossConfig;
+
+    /**
+     * 上传文件到 OSS(保存到 yyyyMM 目录下,文件名随机生成)
+     *
+     * @param file 文件
+     * @return 文件地址
+     */
+    public String upload(MultipartFile file) {
+        String result = "";
+        String date = DateUtil.format(new Date(), DatePattern.SIMPLE_MONTH_PATTERN);
+        String filename = UUID.randomUUID().toString().replaceAll("-", "") + OssUtils.getExtension(file, true);
+
+        OSS ossClient = null;
+        try {
+            ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
+
+            if (file.getSize() != 0 && StringUtils.isNotEmpty(file.getName())) {
+                PutObjectRequest putObjectRequest = new PutObjectRequest(ossConfig.getBucketName(),
+                        date + "/" + filename, file.getInputStream());
+                ossClient.putObject(putObjectRequest);
+            }
+
+            result = String.format("%s/%s/%s", ossConfig.getDomain(), date, filename);
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+
+        log.info("[ 上传文件 ] >> result:{}", result);
+        return result;
+    }
+
+    public String download(String dirPath, String mediaUrl) {
+        OSS ossClient = null;
+        try {
+            dirPath = StrUtil.trim(dirPath);
+            String filePath = getFilePathFromMediaUrl(mediaUrl);
+
+            if (StringUtils.isEmpty(dirPath) || StringUtils.isEmpty(filePath)) {
+                return null;
+            }
+            if (filePath.startsWith("\\") || filePath.startsWith("/")) {
+                filePath = filePath.substring(1);
+            }
+
+            Path path = Paths.get(dirPath, filePath);
+            File dir = path.getParent().toFile();
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+
+            String downloadFilePath = path.toString();
+
+            ossClient = new OSSClientBuilder().build(ossConfig.getEndpoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret());
+            if (ossClient.doesObjectExist(ossConfig.getBucketName(), filePath)) {
+                DownloadFileRequest downloadFileRequest = new DownloadFileRequest(ossConfig.getBucketName(), filePath);
+                downloadFileRequest.setDownloadFile(downloadFilePath);
+
+                DownloadFileResult downloadFileResult = ossClient.downloadFile(downloadFileRequest);
+                if (downloadFileResult == null || downloadFileResult.getObjectMetadata() == null) {
+                    return null;
+                }
+            } else {
+                if (downloadByUrl(mediaUrl, downloadFilePath) == null) {
+                    return null;
+                }
+            }
+
+            return downloadFilePath;
+        } catch (Throwable e) {
+            log.error(e.getMessage(), e);
+            return null;
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+    /**
+     * 下载网络文件
+     *
+     * @param strUrl
+     * @param downloadFilePath
+     */
+    public String downloadByUrl(String strUrl, String downloadFilePath) {
+        int byteSum = 0;
+        int byteRead;
+
+        URL url;
+        try {
+            url = new URL(strUrl);
+        } catch (MalformedURLException e) {
+            log.error(String.format("文件URL格式不正确(%s)", strUrl), e);
+            return null;
+        }
+
+        URLConnection conn;
+        try {
+            conn = url.openConnection();
+        } catch (IOException e) {
+            log.error(String.format("打开文件URL出错(%s)", strUrl), e);
+            return null;
+        }
+
+        Path path = Paths.get(downloadFilePath);
+
+        try {
+            if (Files.exists(path)) {
+                Files.delete(path);
+            }
+            Files.createFile(path);
+        } catch (IOException e) {
+            log.error(String.format("创建本地文件出错(%s)", downloadFilePath), e);
+            return null;
+        }
+
+        try (InputStream inStream = conn.getInputStream();
+             FileOutputStream fs = new FileOutputStream(downloadFilePath);) {
+            byte[] buffer = new byte[1024];
+            while ((byteRead = inStream.read(buffer)) != -1) {
+                byteSum += byteRead;
+                System.out.println(byteSum);
+                fs.write(buffer, 0, byteRead);
+            }
+        } catch (FileNotFoundException e) {
+            log.error(String.format("不存在本地文件(%s)", downloadFilePath), e);
+            return null;
+        } catch (IOException e) {
+            log.error(String.format("下载文件失败(%s => %s)", strUrl, downloadFilePath), e);
+            return null;
+        }
+
+        return downloadFilePath;
+    }
+
+    /**
+     * 获取文件路径
+     *
+     * @param mediaUrl
+     * @return
+     */
+    private String getFilePathFromMediaUrl(String mediaUrl) {
+        URI uri = URI.create(mediaUrl);
+        String path = uri.getPath();
+        path = StrUtil.trim(path);
+        if (org.springframework.util.StringUtils.isEmpty(path)) {
+            return path;
+        }
+        if (path.startsWith("/")) {
+            path = path.substring(1);
+        }
+        return StrUtil.trim(path);
+    }
+
+}