SpringBoot整合MinIO实现文档上传与下载
时间: 2025-06-29 13:20:32 浏览: 6
### Spring Boot 整合 MinIO 实现文件上传和下载
#### 1. 添加依赖项
为了使Spring Boot应用程序能够与MinIO服务器交互,需引入`spring-boot-starter-minio-client`或其他兼容库。通常情况下,在项目的`pom.xml`中添加如下Maven依赖:
```xml
<dependency>
<groupId>io.minio</groupId>
<artifactId|minio|version>8.5.7</artifactId>
</dependency>
```
#### 2. 配置MinIO客户端连接属性
编辑`application.properties`或`application.yml`来设置访问密钥、秘密密钥以及目标存储端点。
对于`.properties`文件而言:
```properties
minio.endpoint=http://mylocalhost:9001
minio.accessKey=your-access-key
minio.secretKey=your-secret-key
```
而对于YAML格式,则应如此书写:
```yaml
minio:
endpoint: http://mylocalhost:9001
accessKey: your-access-key
secretKey: your-secret-key
```
以上配置允许程序通过指定的身份验证信息向MinIO实例发起请求[^1]。
#### 3. 创建用于操作对象存储的服务层组件
定义一个名为`FileService.java`的新Java类作为业务逻辑单元,负责处理具体的文件管理任务,比如创建桶(bucket),上载文档等动作。
```java
@Service
public class FileService {
@Autowired
private MinioClient minioClient;
/**
* 检查并创建不存在的桶
*/
public void ensureBucketExists(String bucketName) throws Exception {
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!isExist) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
/**
* 将本地文件流保存至远程仓库内特定位置处
*/
public String uploadFile(InputStream inputStream, String fileName, long fileSize, String contentType, String bucketName) throws Exception {
ensureBucketExists(bucketName);
PutObjectArgs objectArgs = PutObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.stream(inputStream, fileSize, -1L)
.contentType(contentType)
.build();
minioClient.putObject(objectArgs);
return "https://" + bucketName + ".minio.server/" + fileName;
}
}
```
上述代码片段展示了如何利用MinIO Java SDK执行基本的对象存取命令,包括但不限于确认容器存在与否及其初始化过程;同时提供了基于输入数据流传入的方式完成资源持久化的工作流程[^2]。
#### 4. 编写控制器接口供外部调用者提交HTTP POST/GET 请求触发对应方法响应
设计RESTful API风格路径映射规则以便于前端应用或者其他微服务架构下的模块间通信协作。
```java
@RestController
@RequestMapping("/api/files")
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile multipartFile,
@RequestParam(value="bucket", defaultValue="default-bucket") String bucketName){
try{
InputStream stream = multipartFile.getInputStream();
String url = fileService.uploadFile(stream,multipartFile.getOriginalFilename(),multipartFile.getSize(),"application/octet-stream",bucketName);
return new ResponseEntity<>(url, HttpStatus.CREATED);
}catch(Exception e){
System.out.println(e.getMessage());
return new ResponseEntity<>("Failed to upload the file.",HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/{fileName}")
public ResponseEntity<Resource> serveFileAsResource(@PathVariable String fileName,@RequestParam(defaultValue="default-bucket") String bucketName)throws IOException{
GetObjectResponse response=null;
try{
response=fileService.downloadFile(bucketName,fileName);
byte[] bytes=response.readAllBytes();
ByteArrayResource resource=new ByteArrayResource(bytes);
HttpHeaders headers=new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename="+fileName);
return new ResponseEntity<>(resource,headers,response.statusCode());
}finally{
if(response!=null && !response.isClosed()){
response.close();
}
}
}
}
```
这段示例实现了两个主要的功能:一是接收来自用户的文件并通过POST方式将其发送给后台进行实际储存;二是依据GET查询字符串参数定位所需读取的目标实体,并返回其二进制形式的内容以供浏览器展示或是另存为新副本[^3]。
阅读全文
相关推荐


















