尚庭公寓-------图片上传接口

配置类编写

java 复制代码
package com.nie.lease.common.minio;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Configuration
public class MinioConfiguration {

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.access-key}")
    private String accessKey;

    @Value("${minio.secret-key}")
    private String secretKey;

    @Bean
    public MinioClient minioClient(){

        return MinioClient.builder().endpoint( endpoint).credentials(accessKey, secretKey).build();
    }
}

属性

java 复制代码
server:
  port: 8080

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://192.168.10.101:3306/lease?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
    username: root
    password: Niehaihai.123
    hikari:
      connection-test-query: SELECT 1 # 自动检测连接
      connection-timeout: 60000 # 数据库连接超时时间,默认30秒
      idle-timeout: 500000 # 空闲连接存活最大时间,默认600000(10分钟)
      max-lifetime: 540000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
      maximum-pool-size: 12 # 连接池最大连接数,默认是10
      minimum-idle: 10 # 最小空闲连接数量
      pool-name: SPHHikariPool # 连接池名称

# 用于打印对象生成的sql语句,便于调试
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

minio:
  endpoint: http://192.168.10.101:9000
  access-key: minioadmin
  secret-key: minioadmin
  bucket-name: lease

controller类

java 复制代码
package com.nie.lease.web.admin.controller.apartment;


import com.nie.lease.common.result.Result;
import com.nie.lease.web.admin.service.FileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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;


@Tag(name = "文件管理")
@RequestMapping("/admin/file")
@RestController
public class FileUploadController {

    @Autowired
    private FileService fileService;
    @Operation(summary = "上传文件")
    @PostMapping("upload")
    public Result<String> upload(@RequestParam MultipartFile file) {
        String url=fileService.upload(file);
        return Result.ok(url);
    }

}

service接口类

java 复制代码
package com.nie.lease.web.admin.service;

import org.springframework.web.multipart.MultipartFile;

public interface FileService {

    String upload(MultipartFile file);
}

service实现类

java 复制代码
package com.nie.lease.web.admin.service.impl;

import com.nie.lease.web.admin.service.FileService;
import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService {

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.endpoint}")
    private String endpoint;

    @Value("${minio.bucket-name}")
    private String bucketName;

    public String upload(MultipartFile file) {
        try {
            boolean bucketExists = minioClient.bucketExists(
                    BucketExistsArgs.builder().
                            bucket(bucketName).build());
            if (!bucketExists){
                minioClient.makeBucket(
                        MakeBucketArgs.builder()
                                .bucket(bucketName)
                                .build());
                minioClient.setBucketPolicy(
                        SetBucketPolicyArgs.builder()
                                .bucket(bucketName)
                                .config(createBucketPolicyConfig(bucketName))
                                .build());
            }
            String filename = new SimpleDateFormat("yyyyMMdd").format(new Date()) +
                    "/" + UUID.randomUUID() + "-" + file.getOriginalFilename();
            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(bucketName)
                            .stream(file.getInputStream(),file.getSize(),-1)
                            .object(filename)
                            .contentType(file.getContentType())
                            .build());
            return String.join("/",endpoint,bucketName,filename);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    private String createBucketPolicyConfig(String bucketName) {
        return """
    {
        "Statement" : [ {
            "Action" : "s3:GetObject",
            "Effect" : "Allow",
            "Principal" : "*",
            "Resource" : "arn:aws:s3:::%s/*"
        } ],
        "Version" : "2012-10-17"
    }
    """.formatted(bucketName);
    }

}

测试结果: 当我们随便上传一张图片后

他会给我们返回一个URL

我们用浏览器访问他一下 发现他成功被访问 这说明我们配置正确