Java Web Application Integration with MinIO Object Storage

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.

Tags: MinIO java Spring Boot File Upload Object Storage

Posted on Tue, 18 Aug 2026 16:51:45 +0000 by novice4eva