Springboot整合MinIo
一、添加依赖
//若最新版的启动时报错,请降低版本
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
二、添加配置
# minio 参数配置
minio:
endpoint: 你的minio api IP
accessKey: 你的用户名
secretKey: 你的密码
bucketName: 桶名称
三、编写配置类
@Configuration
@Data
public class MinIoClientConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Value("${minio.bucketName}")
private String bucketName;
/**
* 注入minio 客户端
* @return
*/
@Bean
public MinioClient minioClient(){
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
四、编写工具类(或业务代码)
@Component
@Slf4j
public class MinioUtil {
private static final String FILE_NAME_PATTERN = "{}_{}";
private static final int RESPONSE_SUCCESS_CODE = 200;
@Autowired
private MinioClient minioClient;
/**
* description: 判断bucket是否存在
*
* @param bucketName 桶名称
* @return: void
* @time: 2022/8/17 15:03
*/
public boolean bucketExists(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
/**
* description: 创建bucket
*
* @param bucketName 桶名称
* @return: void
* @time: 2022/8/17 15:03
*/
public void createBucket(String bucketName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!isExist) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
}
/**
* description: 获取全部bucket
*
* @return: void
* @time: 2022/8/17 15:03
*/
public List<Bucket> getAllBuckets() throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
return minioClient.listBuckets();
}
/**
* description: 上传文件并返回文件名称
*
* @param bucketName 桶名称
* @param file MultipartFile文件流
* @return: java.lang.String
* @time: 2021/08/19
*/
public String upload(MultipartFile file, String bucketName) throws Exception {
//判断桶是否存在
boolean b = this.bucketExists(bucketName);
if (!b) {
this.createBucket(bucketName);
}
// 上传文件的原始文件名
String originalFilename = file.getOriginalFilename();
// 文件大小
long fileSize = file.getSize();
log.info("上传文件的原始文件名:{},文件大小:{},文件类型为:{}", originalFilename, fileSize, file.getContentType());
// 文件名:日期_原始文件名
String fileName = StrUtil.format(FILE_NAME_PATTERN, DateUtil.format(new Date(), "yyyyMMddHHmmss"), originalFilename);
log.info("格式化后的文件名:{}", fileName);
try {
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
.object(fileName).stream(file.getInputStream(), fileSize, -1).contentType(file.getContentType()).build());
} catch (Exception e) {
log.info("上传文件失败!" + e.getMessage());
}
return fileName;
}
/**
* description: 上传文件并返回文件名称
*
* @param bucketName 桶名称
* @param file MultipartFile文件流
* @return: java.lang.String
* @time: 2021/08/19
*/
public String upload(MultipartFile file, String bucketName, String name, String type) throws Exception {
//判断桶是否存在
boolean b = this.bucketExists(bucketName);
if (!b) {
this.createBucket(bucketName);
}
if (type == null) {
type = file.getContentType();
}
if (name == null) {
// 上传文件的原始文件名
name = file.getOriginalFilename();
}
// 文件大小
long fileSize = file.getSize();
log.info("上传文件的原始文件名:{},文件大小:{},文件类型为:{}", name, fileSize, type);
// 文件名:日期_原始文件名
String fileName = StrUtil.format(FILE_NAME_PATTERN, DateUtil.format(new Date(), "yyyyMMddHHmmss"), name);
log.info("格式化后的文件名:{}", fileName);
try {
minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
.object(fileName).stream(file.getInputStream(), fileSize, -1).contentType(type).build());
} catch (Exception e) {
log.info("上传文件失败!" + e.getMessage());
}
return fileName;
}
/**
* description: 获取文件url并设置过期时间
*
* @param bucketName 桶名称
* @param fileName 文件名称
* @param expires 过期时间(不指定默认为7200秒)
* @return: url 文件路径
* @time: 2021/08/19
*/
public String getFileUrl(String bucketName, String fileName, Integer expires) throws Exception {
BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();
boolean bucketExists = minioClient.bucketExists(bucketArgs);
if (expires == null) {
expires = 60 * 60 * 2;
}
String url = "";
if (bucketExists) {
GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
.method(Method.GET)
.bucket(bucketName)
.object(fileName)
.expiry(expires)
.build();
url = minioClient.getPresignedObjectUrl(getPresignedObjectUrlArgs);
}
return url;
}
/**
* description: 下载文件
*
* @param bucketName 桶名称
* @param fileName 文件名称
* @return: byte[] 文件数组
* @time: 2021/08/19
*/
public byte[] download(String bucketName, String fileName) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
BucketExistsArgs bucketArgs = BucketExistsArgs.builder().bucket(bucketName).build();
boolean bucketExists = minioClient.bucketExists(bucketArgs);
log.info("bucketExists:{}", bucketExists);
InputStream stream = minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(fileName)
.build());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while((rc=stream.read(buff, 0, 100))>0) {
baos.write(buff, 0, rc);
}
return baos.toByteArray();
}
}
五、测试接口
@RestController
@RequestMapping("/minio")
public class MinIoController {
@Autowired
private MinioUtil minioUtil;
@Autowired
private MinIoClientConfig minIoClientConfig;
@PostMapping("uploadFile")
public void uploadFile(@RequestParam("image") MultipartFile multipartFile){
try {
minioUtil.upload(multipartFile,minIoClientConfig.getBucketName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、补充
docker安装minio命令
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio1 \
-v ~/minio/data:workSpace/minio \
-e "MINIO_ROOT_USER=AKIAIOSFODNN7EXAMPLE"
-e "MINIO_ROOT_PASSWORD=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
quay.io/minio/minio server /data --console-address ":9001"
-v:文件存放的本地目录
-e:用户名和密码
MinIo官网地址:min.io/docs/minio/…
本片记录纯粹是为了方便自己之后复习的时候使用观看,如有错误,望请指点!