Browse Source

添加MinIO文件上传支持

macro 5 years ago
parent
commit
a9ae8c684b

+ 4 - 0
mall-admin/pom.xml

@@ -33,6 +33,10 @@
             <groupId>net.logstash.logback</groupId>
             <artifactId>logstash-logback-encoder</artifactId>
         </dependency>
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 85 - 0
mall-admin/src/main/java/com/macro/mall/controller/MinioController.java

@@ -0,0 +1,85 @@
+package com.macro.mall.controller;
+
+import com.macro.mall.common.api.CommonResult;
+import com.macro.mall.dto.MinioUploadDto;
+import io.minio.MinioClient;
+import io.minio.policy.PolicyType;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * Created by macro on 2019/12/25.
+ */
+@Api(tags = "MinioController", description = "MinIO对象存储管理")
+@Controller
+@RequestMapping("/minio")
+public class MinioController {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(MinioController.class);
+    @Value("${minio.endpoint}")
+    private String ENDPOINT;
+    @Value("${minio.bucketName}")
+    private String BUCKET_NAME;
+    @Value("${minio.accessKey}")
+    private String ACCESS_KEY;
+    @Value("${minio.secretKey}")
+    private String SECRET_KEY;
+
+    @ApiOperation("文件上传")
+    @RequestMapping(value = "/upload", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult upload(@RequestParam("file") MultipartFile file) {
+        try {
+            //创建一个MinIO的Java客户端
+            MinioClient minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY);
+            boolean isExist = minioClient.bucketExists(BUCKET_NAME);
+            if (isExist) {
+                LOGGER.info("存储桶已经存在!");
+            } else {
+                //创建存储桶并设置只读权限
+                minioClient.makeBucket(BUCKET_NAME);
+                minioClient.setBucketPolicy(BUCKET_NAME, "*.*", PolicyType.READ_ONLY);
+            }
+            String filename = file.getOriginalFilename();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            // 设置存储对象名称
+            String objectName = sdf.format(new Date()) + "/" + filename;
+            // 使用putObject上传一个文件到存储桶中
+            minioClient.putObject(BUCKET_NAME, objectName, file.getInputStream(), file.getContentType());
+            LOGGER.info("文件上传成功!");
+            MinioUploadDto minioUploadDto = new MinioUploadDto();
+            minioUploadDto.setName(filename);
+            minioUploadDto.setUrl(ENDPOINT + "/" + BUCKET_NAME + "/" + objectName);
+            return CommonResult.success(minioUploadDto);
+        } catch (Exception e) {
+            LOGGER.info("上传发生错误: {}!", e.getMessage());
+        }
+        return CommonResult.failed();
+    }
+
+    @ApiOperation("文件删除")
+    @RequestMapping(value = "/delete", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult delete(@RequestParam("objectName") String objectName) {
+        try {
+            MinioClient minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY);
+            minioClient.removeObject(BUCKET_NAME, objectName);
+            return CommonResult.success(null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return CommonResult.failed();
+    }
+}

+ 15 - 0
mall-admin/src/main/java/com/macro/mall/dto/MinioUploadDto.java

@@ -0,0 +1,15 @@
+package com.macro.mall.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 文件上传返回结果
+ * Created by macro on 2019/12/25.
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MinioUploadDto {
+    private String url;
+    private String name;
+}

+ 11 - 0
mall-admin/src/main/resources/application.yml

@@ -1,6 +1,10 @@
 spring:
   profiles:
     active: dev #默认为开发环境
+  servlet:
+    multipart:
+      enabled: true #开启文件上传
+      max-file-size: 10MB #限制文件上传大小为10M
 
 mybatis:
   mapper-locations:
@@ -29,6 +33,7 @@ secure:
       - /druid/**
       - /admin/login
       - /admin/register
+      - /minio/upload
 
 aliyun:
   oss:
@@ -43,6 +48,12 @@ aliyun:
     dir:
       prefix: mall/images/ # 上传文件夹路径前缀
 
+minio:
+  endpoint: http://192.168.3.101:9090 #MinIO服务所在地址
+  bucketName: mall #存储桶名称
+  accessKey: minioadmin #访问的key
+  secretKey: minioadmin #访问的秘钥
+
 logging:
   level:
     root: info #日志配置DEBUG,INFO,WARN,ERROR

+ 7 - 0
pom.xml

@@ -45,6 +45,7 @@
         <jjwt.version>0.9.0</jjwt.version>
         <aliyun-oss.version>2.5.0</aliyun-oss.version>
         <logstash-logback.version>4.8</logstash-logback.version>
+        <minio.version>3.0.10</minio.version>
         <mall-common.version>1.0-SNAPSHOT</mall-common.version>
         <mall-mbg.version>1.0-SNAPSHOT</mall-mbg.version>
         <mall-security.version>1.0-SNAPSHOT</mall-security.version>
@@ -175,6 +176,12 @@
                 <artifactId>logstash-logback-encoder</artifactId>
                 <version>${logstash-logback.version}</version>
             </dependency>
+            <!--MinIO JAVA SDK-->
+            <dependency>
+                <groupId>io.minio</groupId>
+                <artifactId>minio</artifactId>
+                <version>${minio.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>