SpringBoot整合MinIO实现文件上传的方法详解
简介
MinIO是一款开源的分布式对象存储服务,提供了一个Amazon S3兼容的API,可以轻松地在分布式系统中存储海量的数据。
本文将介绍如何在SpringBoot项目中使用MinIO进行文件上传,主要包括以下几个步骤:
- 引入依赖
- 配置MinIO连接信息
- 编写上传文件的Controller
- 测试上传文件功能
引入依赖
首先,在项目的pom.xml文件中引入MinIO的依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>RELEASE.2021-10-01T01-38-11Z</version>
</dependency>
配置MinIO连接信息
在SpringBoot项目中,可以将MinIO连接信息配置在application.properties文件或application.yml文件中。以下是application.yml文件的配置示例:
minio:
url: http://localhost:9000
access-key: minioadmin
secret-key: minioadmin
bucket-name: test-bucket
编写上传文件的Controller
在SpringBoot中,可以使用MultipartFile类型接收上传的文件。编写上传文件的Controller如下:
@RestController
public class UploadController {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucket-name}")
private String bucketName;
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception {
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
InputStream inputStream = file.getInputStream();
String originalFileName = file.getOriginalFilename();
String contentType = file.getContentType();
String objectName = UUID.randomUUID().toString() + originalFileName.substring(originalFileName.lastIndexOf("."));
ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.build());
return "上传成功,文件访问地址:" + minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(1, TimeUnit.HOURS)
.build());
}
}
测试上传文件功能
在完成以上步骤后,可以通过Postman等工具进行文件上传测试。以下是一个测试示例:
- 使用POST请求访问http://localhost:8080/upload
- 在Body中选择form-data格式,设置Key为file,选择一个待上传的文件
- 发送请求,等待返回结果。如果上传成功,响应结果中会包含文件的访问地址。
示例说明
以下是使用以上代码实现文件上传的两个示例:
示例1:上传文件并将访问地址保存到数据库
@Service
public class FileServiceImpl implements FileService {
@Autowired
private MinioClient minioClient;
@Value("${minio.bucket-name}")
private String bucketName;
@Autowired
private FileRepository fileRepository;
@Override
public String uploadFile(MultipartFile file) throws Exception {
if (file.isEmpty()) {
throw new RuntimeException("上传失败,请选择文件");
}
InputStream inputStream = file.getInputStream();
String originalFileName = file.getOriginalFilename();
String contentType = file.getContentType();
String objectName = UUID.randomUUID().toString() + originalFileName.substring(originalFileName.lastIndexOf("."));
ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.build());
String fileUrl = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(objectName)
.expiry(1, TimeUnit.HOURS)
.build());
FileEntity fileEntity = new FileEntity();
fileEntity.setName(originalFileName);
fileEntity.setObjectUrl(fileUrl);
fileRepository.save(fileEntity);
return fileUrl;
}
}
示例2:通过MinIO的Java SDK实现文件上传
public class MinioFileUploader {
private static final String MINIO_URL = "http://localhost:9000";
private static final String ACCESS_KEY = "minioadmin";
private static final String SECRET_KEY = "minioadmin";
private static final String BUCKET_NAME = "test-bucket";
public static void main(String[] args) throws Exception {
MinioClient minioClient = MinioClient.builder()
.endpoint(MINIO_URL)
.credentials(ACCESS_KEY, SECRET_KEY)
.build();
File file = new File("E:/example.txt");
InputStream inputStream = new FileInputStream(file);
String contentType = Files.probeContentType(file.toPath());
String objectName = UUID.randomUUID().toString() + file.getName().substring(file.getName().lastIndexOf("."));
System.out.println("上传的文件名:" + file.getName());
System.out.println("文件保存到MinIO的名称:" + objectName);
ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
.bucket(BUCKET_NAME)
.object(objectName)
.contentType(contentType)
.stream(inputStream, inputStream.available(), -1)
.build());
System.out.println("文件已上传,访问地址为:" + minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(BUCKET_NAME)
.object(objectName)
.expiry(1, TimeUnit.HOURS)
.build()));
}
}
以上是SpringBoot整合MinIO实现文件上传的方法详解,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合MinIO实现文件上传的方法详解 - Python技术站