Procházet zdrojové kódy

minio 在线访问

yangyb před 3 týdny
rodič
revize
00367a1a66

+ 82 - 10
operating-service/src/main/java/com/txz/operating/config/minio/MinioUtil.java

@@ -14,6 +14,7 @@ import org.apache.http.client.methods.HttpPut;
 import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -32,6 +33,9 @@ public class MinioUtil {
     @Resource
     private CustomMinioClient minioClient;
 
+    @Value("${minio.url}")
+    private String baseUrl;
+
     /**
      * 创建一个桶
      */
@@ -39,6 +43,8 @@ public class MinioUtil {
         boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
         if (!found) {
             minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
+            // 设置为公开访问
+            setBucketPublic(bucket);
         }
     }
 
@@ -46,23 +52,78 @@ public class MinioUtil {
      * 上传一个文件
      */
     public String uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
-        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
-                .stream(stream, -1, 10485760).contentType("Content-Type").build());
-        GetPresignedObjectUrlArgs presignedArgs = GetPresignedObjectUrlArgs.builder()
-                .method(Method.GET)
+        String contentType = getContentType(objectName);
+
+        HashMultimap<String, String> headers = HashMultimap.create();
+        headers.put("x-amz-acl", "public-read");
+        minioClient.putObject(PutObjectArgs.builder()
                 .bucket(bucket)
                 .object(objectName)
-                .expiry(7, TimeUnit.DAYS)
-                .build();
-        minioClient.getPresignedObjectUrl(presignedArgs);
-        String fullUrl = minioClient.getPresignedObjectUrl(presignedArgs);
-        return getPathFromUrl(fullUrl);
+                .stream(stream, -1, 10485760)
+                .contentType(contentType)
+                .headers(headers)
+                .build());
+        String fullUrl = baseUrl + "/" + bucket +"/" + objectName;
+        System.out.println("上传成功,访问地址为:" + fullUrl);
+//        GetPresignedObjectUrlArgs presignedArgs = GetPresignedObjectUrlArgs.builder()
+//                .method(Method.GET)
+//                .bucket(bucket)
+//                .object(objectName)
+//                .expiry(7, TimeUnit.DAYS)
+//                .build();
+//        minioClient.getPresignedObjectUrl(presignedArgs);
+//        String fullUrl = minioClient.getPresignedObjectUrl(presignedArgs);
+//        return getPathFromUrl(fullUrl);
+        return fullUrl;
+    }
+
+    // 设置 bucket 为允许公开访问
+    public void setBucketPublic(String bucketName) throws Exception {
+        String policyJson = "{\n" +
+                "  \"Version\": \"2012-10-17\",\n" +
+                "  \"Statement\": [\n" +
+                "    {\n" +
+                "      \"Sid\": \"PublicReadGetObject\",\n" +
+                "      \"Effect\": \"Allow\",\n" +
+                "      \"Principal\": \"*\",\n" +
+                "      \"Action\": \"s3:GetObject\",\n" +
+                "      \"Resource\": \"arn:aws:s3:::" + bucketName + "/*\"\n" +
+                "    }\n" +
+                "  ]\n" +
+                "}";
+
+        minioClient.setBucketPolicy(
+                SetBucketPolicyArgs.builder()
+                        .bucket(bucketName)
+                        .config(policyJson)
+                        .build()
+        );
+    }
+
+    private String getContentType(String objectName) {
+        String contentType;
+        String fileExtension = objectName.substring(objectName.lastIndexOf("."));
+        switch (fileExtension.toLowerCase()) {
+            case ".jpg":
+            case ".jpeg":
+                contentType = "image/jpeg";
+                break;
+            case ".png":
+                contentType = "image/png";
+                break;
+            case ".mp4":
+                contentType = "video/mp4";
+                break;
+            default:
+                contentType = "application/octet-stream";
+        }
+        return contentType;
     }
 
     public String getPathFromUrl(String fullUrl) {
         try {
             URL url = new URL(fullUrl);
-            return url.getPath();
+            return baseUrl + url.getPath();
         } catch (Exception e) {
             e.printStackTrace();
             return null;
@@ -114,6 +175,17 @@ public class MinioUtil {
      * 删除一个桶
      */
     public void deleteBucket(String bucket) throws Exception {
+        Iterable<Result<Item>> results = minioClient.listObjects(
+                ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
+
+        // 删除所有文件
+        for (Result<Item> result : results) {
+            Item item = result.get();
+            minioClient.removeObject(RemoveObjectArgs.builder()
+                    .bucket(bucket)
+                    .object(item.objectName())
+                    .build());
+        }
         minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
     }
 

+ 20 - 8
operating-service/src/main/java/com/txz/operating/controller/UploadController.java

@@ -35,19 +35,31 @@ public class UploadController {
     @ApiOperation("上传一个文件")
     @PostMapping(value = "/upload")
     public Result fileUpload(@RequestParam MultipartFile file) throws Exception {
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null || originalFilename.isEmpty()) {
+            return Result.fail("文件名为空");
+        }
+
+        // 提取文件后缀
+        String fileExtension = "";
+        int dotIndex = originalFilename.lastIndexOf(".");
+        if (dotIndex > 0) {
+            fileExtension = originalFilename.substring(dotIndex);
+        }
         String dir = DateUtil.format(new Date(), NORM_DAY_PATTERN) + "/";
-        String fileName = IdUtil.simpleUUID();
+        String fileName = IdUtil.simpleUUID()+ fileExtension;
 
         // 暂时都放在img里边
-        String bucket = "img";
-        String url  = "";
-        String objectName = "";
-        minioUtil.createBucket(bucket);
-        if (objectName != null) {
-            url = minioUtil.uploadFile(file.getInputStream(), bucket, dir + "/" + fileName);
+        String bucket;
+        if (fileExtension.equalsIgnoreCase(".mp4")) {
+            bucket = "video";
+        } else if (fileExtension.matches("(?i)\\.(jpg|png|gif)")) {
+            bucket = "img";
         } else {
-            url = minioUtil.uploadFile(file.getInputStream(), bucket, fileName);
+            bucket = "docs";
         }
+        minioUtil.createBucket(bucket);
+        String url = minioUtil.uploadFile(file.getInputStream(), bucket, dir + fileName);
         return Result.success(url);
     }