一、Windows下安装MinIO
方法1:通过可执行文件安装
下载MinIO Server
访问MinIO官网下载页面:Download High-Performance Object Storage | MinIO
下载
minio.exe
文件。
创建数据存储目录
新建一个文件夹用于存储MinIO数据,例如:
D:\minio\data
。
启动MinIO Server
打开命令提示符(CMD)或PowerShell,执行以下命令:
minio.exe server D:\minio\data --console-address :9090
--console-address :9090
指定控制台端口为9090(默认API端口为9000)。报错解决:
setx MINIO_ROOT_USER minioadmin setx MINIO_ROOT_PASSWORD minioadmin
FATAL Unable to validate credentials inherited from the shell environment: Invalid credentials > Please provide correct credentials HINT: MINIO_ROOT_USER length should be at least 3, and MINIO_ROOT_PASSWORD length at least 8 characters
访问MinIO控制台
打开浏览器,访问:
http://localhost:9090
默认账号密码:
minioadmin
/minioadmin
方法2:通过PowerShell安装(推荐)
下载并运行安装脚本
Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "C:\minio\minio.exe"
启动MinIO
C:\minio\minio.exe server D:\minio\data --console-address :9090
二、Spring Boot接入MinIO
1. 添加依赖
在 pom.xml
中添加以下依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.7</version>
</dependency>
<!-- 或使用Amazon S3 SDK(推荐) -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.590</version>
</dependency>
2. 配置MinIO连接信息
创建存储桶并配置访问密钥。
在 application.properties
或 application.yml
中添加配置:
# MinIO配置
minio.endpoint=http://localhost:9000
minio.access-key=minioadmin
minio.secret-key=minioadmin
minio.bucket-name=mybucket
3. 创建MinIO配置类
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@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 AmazonS3 amazonS3() {
return AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpoint, ""))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.withPathStyleAccessEnabled(true) // 必须启用路径风格访问
.build();
}
}
4. 实现文件上传/下载功能
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.PutObjectResult;
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.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@Service
public class MinioService {
@Autowired
private AmazonS3 amazonS3;
@Value("${minio.bucket-name}")
private String bucketName;
// 创建存储桶
public void createBucket() {
if (!amazonS3.doesBucketExistV2(bucketName)) {
amazonS3.createBucket(bucketName);
}
}
// 上传文件
public String uploadFile(MultipartFile file) throws IOException {
File convertedFile = convertMultiPartToFile(file);
PutObjectResult result = amazonS3.putObject(bucketName, file.getOriginalFilename(), convertedFile);
convertedFile.delete();
return "File uploaded: " + file.getOriginalFilename();
}
// 下载文件
public byte[] downloadFile(String fileName) {
return amazonS3.getObject(bucketName, fileName).getObjectContent().readAllBytes();
}
// 删除文件
public void deleteFile(String fileName) {
amazonS3.deleteObject(bucketName, fileName);
}
private File convertMultiPartToFile(MultipartFile file) throws IOException {
File convFile = new File(file.getOriginalFilename());
FileOutputStream fos = new FileOutputStream(convFile);
fos.write(file.getBytes());
fos.close();
return convFile;
}
}
5. 创建Controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/api/files")
public class FileController {
@Autowired
private MinioService minioService;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try {
return minioService.uploadFile(file);
} catch (Exception e) {
return "Upload failed: " + e.getMessage();
}
}
@GetMapping("/download/{fileName}")
public ResponseEntity<byte[]> downloadFile(@PathVariable String fileName) {
byte[] data = minioService.downloadFile(fileName);
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"")
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(data);
}
}
三、验证测试
启动Spring Boot应用。
使用Postman或浏览器测试:
上传文件:
POST http://localhost:8080/api/files/upload
下载文件:
GET http://localhost:8080/api/files/download/{fileName}