Java SpringBoot 集成 MinIO 资料
一、文档
二、个人实战
注意事项:
部署MinIO时会涉及到两个端口号,一个为endpoint的端口,一个为console的端口,注意不要弄混
比如:
- endpoint的端口为18893
- console的端口为18894
-
pom.xml
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.0.2</version> </dependency>
-
配置文件
minio: bucket: endpoint: access-key: secret-key: url: ${minio.endpoint}/${minio.bucket}/
-
配置实体类
@Data @ConfigurationProperties(prefix = "minio") public class MinIOProperty { private String bucket; private String endpoint; private String access_key; private String secret_key; private String url; }
@Configuration @EnableConfigurationProperties({MinIOProperty.class}) public class ApplicationConfig { }
-
DTO
@Data @ApiModel(description = "文件的DTO") public class FileDTO { @ApiModelProperty(value = "上传文件原始名称") private String origin_file_name; @ApiModelProperty(value = "上传文件格式化后的名称") private String encode_file_name; @ApiModelProperty(value = "上传文件的地址") private String url; }
-
Util
@Service public class MinIOUtil { private final MinIOProperty minIOProperty; private final MinioClient minioClient; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss_"); public MinIOUtil(MinIOProperty minIOProperty) throws InvalidPortException, InvalidEndpointException { this.minIOProperty = minIOProperty; this.minioClient = new MinioClient( minIOProperty.getEndpoint(), minIOProperty.getAccess_key(), minIOProperty.getSecret_key() ); } public FileDTO upload(String path, MultipartFile multipartFile) throws Exception { // bucket 不存在,创建 if (!minioClient.bucketExists(this.minIOProperty.getBucket())) { minioClient.makeBucket(this.minIOProperty.getBucket()); } try (InputStream inputStream = multipartFile.getInputStream()) { // 上传文件的名称 String fileName = multipartFile.getOriginalFilename(); //格式化文件名称 String encode_fileName = this.getNowString() + fileName; String objectName = path + "/" + encode_fileName; // PutObjectOptions,上传配置(文件大小,内存中文件分片大小) PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE); // 文件的ContentType putObjectOptions.setContentType(multipartFile.getContentType()); minioClient.putObject(this.minIOProperty.getBucket(), objectName, inputStream, putObjectOptions); // 返回访问路径 assert fileName != null; FileDTO fileDTO = new FileDTO(); fileDTO.setOrigin_file_name(fileName); fileDTO.setEncode_file_name(encode_fileName); fileDTO.setUrl(this.minIOProperty.getUrl() + UriUtils.encode(objectName, StandardCharsets.UTF_8)); return fileDTO; } } private String getNowString() { Date date = new Date(); return this.sdf.format(date); } }
-
Controller
@Api(tags = "MinIO文件上传模块") @RestController @CrossOrigin @RequestMapping("/minio") public class MinioController { private final MinIOUtil minIOUtil; private final CaseFileService caseFileService; public MinioController(MinIOUtil minIOUtil, CaseFileService caseFileService) { this.minIOUtil = minIOUtil; this.caseFileService = caseFileService; } @PostMapping("/upload") @ApiOperation(value = "上传文件") @ApiImplicitParams({ @ApiImplicitParam(name = "file", value = "上传的文件", required = true) }) public void upload(@RequestParam("file") MultipartFile multipartFile) throws Exception { FileDTO fileDTO = this.minIOUtil.upload("", multipartFile); } }