MinIO是一款高性能的分布式对象存储服务,兼容Amazon S3 API,适用于存储图片、文档等非结构化数据。
核心术语:
# 下载二进制文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
# 创建数据目录
mkdir -p /opt/minio/data
# 启动服务(控制台端口9000,API端口9001)
./minio server /opt/minio/data \
--console-address ":9000" \
--address ":9001"
创建/etc/systemd/system/minio.service
:
[Unit]
Description=MinIO
After=network.target
[Service]
User=root
ExecStart=/usr/local/bin/minio server /opt/minio/data \
--console-address ":9000" \
--address ":9001"
Restart=always
[Install]
WantedBy=multi-user.target
启动服务:
systemctl daemon-reload
systemctl start minio
systemctl enable minio
http://服务器IP:9000
user-uploads
)
io.minio
minio
8.5.7
application.properties
:
# MinIO配置
minio.endpoint=http://your-server-ip:9001
minio.access-key=your-access-key
minio.secret-key=your-secret-key
minio.bucket-name=user-uploads
@Configuration
public class MinioConfig {
@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();
}
}
@Service
public class MinioService {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucket-name}")
private String bucketName;
// 初始化Bucket检查
@PostConstruct
public void init() throws Exception {
boolean exists = minioClient.bucketExists(
BucketExistsArgs.builder().bucket(bucketName).build()
);
if (!exists) {
minioClient.makeBucket(
MakeBucketArgs.builder().bucket(bucketName).build()
);
}
}
// 文件上传
public String uploadFile(String objectName, InputStream stream,
String contentType) throws Exception {
minioClient.putObject(
PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.stream(stream, -1, 10485760) // 10MB分片
.contentType(contentType)
.build()
);
return objectName;
}
// 文件下载
public InputStream downloadFile(String objectName) throws Exception {
return minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.build()
);
}
}
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private MinioService minioService;
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
try {
return minioService.uploadFile(
file.getOriginalFilename(),
file.getInputStream(),
file.getContentType()
);
} catch (Exception e) {
throw new RuntimeException("上传失败: " + e.getMessage());
}
}
}
@SpringBootTest
class MinioServiceTest {
@Autowired
private MinioService minioService;
@Test
void testUpload() throws Exception {
File file = new File("test.txt");
FileInputStream stream = new FileInputStream(file);
String objectName = minioService.uploadFile(
"test.txt", stream, "text/plain");
assertNotNull(objectName);
}
}
# 修改默认凭证
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=StrongPassword!123
# 启动时指定
./minio server ... --console-address ":9000" \
MINIO_ROOT_USER=admin \
MINIO_ROOT_PASSWORD=StrongPassword!123
4节点集群启动命令:
./minio server http://node{1...4}/data
问题现象 | 解决方案 |
---|---|
403 Forbidden | 检查AccessKey/SecretKey是否正确 |
连接超时 | 确认防火墙开放9000/9001端口 |
上传大文件失败 | 增加JVM内存:-Xmx512m |
NoSuchBucketException | 检查Bucket是否存在并配置正确 |
依赖冲突 | 排除旧版okhttp依赖: |
延伸阅读:
本教程完整代码已托管GitHub,建议结合Docker Compose进行本地开发环境搭建。如有其他技术问题,欢迎在评论区留言讨论!