1. minio
官网:https://www.minio.org.cn/
windows启动方式:minio.exe server D:\worksoft\minio
访问:http://localhost:9000
2. 引入mvn包
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.3.5</version>
</dependency>
3.实现
properties
# Minio配置
# ip地址
minio.endpoint=127.0.0.1
# 端口号
minio.port=9000
# 账号
minio.accessKey=minioadmin
# 密码
minio.secretKey=minioadmin
#如果是true,则用的是https而不是http,默认值是true
minio.secure=false
# 桶的名字
minio.bucketName=testfile
#保存到本地的路径
minio.configDir="D:/"
config 类
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
// # ip地址
// minio.endpoint=127.0.0.1
private String endpoint;
// # 端口号
// minio.port=9000
private String port;
// # 账号
// minio.accessKey=minioadmin
private String accessKey;
//# 密码
// minio.secretKey=minioadmin
private String secretKey;
//#如果是true,则用的是https而不是http,默认值是true
// minio.secure=false
private String secure;
// # 桶的名字
// minio.bucketName="huike-crm"
private String bucketName;
// #保存到本地的路径
// minio.configDir="/data/excel"
private String configDir;
}
controller
@ApiOperation("minio调用")
@PostMapping("/uploadMinio")
public AjaxResult uploadFileMinio(MultipartFile file) {
return minioService.uploadFile(file);
}
service
@Autowired
private MinioConfig minioConfig;
@Override
public AjaxResult uploadFile(MultipartFile file) {
InputStream inputStream = null;
//创建Minio的连接对象
MinioClient minioClient = getClient();
//桶对象
String bucketName = minioConfig.getBucketName();
try {
inputStream = file.getInputStream();
//基于官网的内容,判断文件存储的桶是否存在 如果桶不存在就创建桶
boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (exists) {
System.out.println("该桶已经存在");
} else {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
/**
* ================================操作文件================================
* 思路:我们上传的文件是:文件.pdf
* 那么我们应该上传到配置的bucket内 我们配置的bucketName是huike-crm
* 那么我们存在桶里的文件应该是什么样的 也叫“文件.pdf”吗?
* 应该按照上传的年月日进行区分
* 举例:2021-05-05日进行上传的
* 那么存在桶里的路径应该是
* huike-crm/2021/05/05/这个目录下
* 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
* 那么完整的路径就是 huike-crm/2021/05/05/uuid.pdf
*
* 如果上述思路你无法理解,那么就直接存放在桶内生成uuid+.pdf即可
* 即:huike-crm/uuid.pdf
*/
//操作文件
String fileName = file.getOriginalFilename();
String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) + UUID.randomUUID().toString().replaceAll("-", "")
+ fileName.substring(fileName.lastIndexOf("."));
PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
.bucket(bucketName)
.contentType(file.getContentType())
.stream(file.getInputStream(), file.getSize(), -1).build();
minioClient.putObject(objectArgs);
//封装访问的url给前端
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", "/" + bucketName + "/" + objectName);
//url需要进行截取
ajax.put("url", minioConfig.getEndpoint() + ":" + minioConfig.getPort() + "/" + minioConfig.getBucketName() + "/" + fileName);
/**
* 构建返回结果集
*/
/**
* 封装需要的数据进行返回
*/
return ajax;
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("上传失败");
} finally {
//防止内存泄漏
if (inputStream != null) {
try {
inputStream.close(); // 关闭流
} catch (IOException e) {
// log.debug("inputStream close IOException:" + e.getMessage());
}
}
}
}
/**
* 免费提供一个获取Minio连接的方法
* 获取Minio连接
* @return
*/
private MinioClient getClient() {
MinioClient minioClient =
MinioClient.builder()
.endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
.credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
.build();
return minioClient;
}
4.返回访问
{
"data": {
"msg": "操作成功",
"fileName": "/testfile/2022/10/09/a808f9c6547f43ac8b5a1ce7318c12ba.png",
"code": 200,
"url": "127.0.0.1:9000/testfile/1.png"
}
}