Introduction
MinIO is an open source object storage solution comptaible with Amazon S3 APIs. It's designed for storing unstructured data such as images, videos, audio files, and logs, with support for objects up to 5TB in size.
Dependencies
Add the following dependencies to your project:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
Configuration
Appplication configuration properties:
minio:
endpoint: 127.0.0.1
port: 9000
accessKey: minioadmin
secretKey: minioadmin
secure: false
bucketName: "kdd-crm"
configDir: "/data/excel"
Configuration class:
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
private String endpoint;
private int port;
private String accessKey;
private String secretKey;
private Boolean secure;
private String bucketName;
}
Implementation
Controller Layer
@PostMapping("/common/upload")
public Result uploadFile(MultipartFile file) {
try {
return fileService.uploadFile(file);
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
MinIO Client Initialization
private MinioClient createMinioClient() {
return MinioClient.builder()
.endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
.credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
.build();
}
File Upload Service
public Result uploadFile(MultipartFile file) {
InputStream fileStream = null;
MinioClient client = createMinioClient();
String container = minioConfig.getBucketName();
try {
fileStream = file.getInputStream();
// Verify bucket existence
boolean containerExists = client.bucketExists(
BucketExistsArgs.builder().bucket(container).build()
);
if (!containerExists) {
client.makeBucket(MakeBucketArgs.builder().bucket(container).build());
}
// Generate file path with date structure
String dateStructure = DateUtil.getDatePath();
String uniqueFileName = UUID.randomUUID() + ".pdf";
// Upload file to MinIO
client.putObject(
PutObjectArgs.builder()
.bucket(container)
.object(dateStructure + "/" + uniqueFileName)
.stream(fileStream, fileStream.available(), -1)
.build()
);
fileStream.close();
// Construct response with file URL
String fileUrl = "http://" + minioConfig.getEndpoint() + ":" +
minioConfig.getPort() + "/" + container + "/" +
dateStructure + "/" + uniqueFileName;
return Result.success().data("url", fileUrl);
} catch (Exception e) {
return Result.error("Upload failed: " + e.getMessage());
} finally {
if (fileStream != null) {
try {
fileStream.close();
} catch (IOException e) {
// Log stream closure error
}
}
}
}
Stream Method Parameters
The PutObjectArgs stream method accepts three parameters:
- stream: Input stream of the file
- objectSize: Total size of the object (-1 if unknown)
- partSize: Size of each partt (-1 for automatic detection)
When object size is known, set partSize to -1 for automatic part size determination. Valid part sizes range from 5MiB to 5GiB.