minio介绍
minio是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3 接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。
安装
查看最新版本的minio镜像
docker search minio
命令拉取minio镜像(后面不跟版本,默认是最新版本镜像)
docker pull minio/minio
创建并启动minio容器
docker run -d -p 9091:9091 -p 9092:9092 --name minio \
-e "MINIO_ACCESS_KEY=minio" \
-e "MINIO_SECRET_KEY=minio123" \
-v /home/admin/minio/data:/data \
-v /home/admin/minio/config:/root/.minio \
minio/minio server /data \
--console-address ":9091" --address ":9092"
以上命令,在最新版本下的docker里面直接运行即可;
MINIO_ACCESS_KEY是登录的用户名,MINIO_SECRET_KEY是登陆的密码,根据自己的情况来设置登录的用户名和密码,
9000端口是对应控制台也就是图形化界面的访问端口;
9098是api访问端口,用于访问照片和sdk上传下载图片,如后续要使用springboot+minio上传图片
如果要设置容器自启在 run命令后加上 “–restart=always ”
docker run --restart=always -d -p 9000:9000 -p 9098:9098 --name minio \
-e "MINIO_ACCESS_KEY=minio" \
-e "MINIO_SECRET_KEY=minio123" \
-v /home/admin/minio/data:/data \
-v /home/admin/minio/config:/root/.minio \
minio/minio server /data \
--console-address ":9000" --address ":9098"
springboot整合minio
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
import cn.hutool.core.lang.UUID;
import io.minio.BucketExistsArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.web.multipart.MultipartFile;
/**
* @author zzx
* @since 2022/12/25
*/
public class MinioUtil {
/** 服务地址 */
private static String url = "*";";
/** 用户名-可视化界面申请的用户名 */
private static String accessKey = "*************";
/** 密码-可视化界面申请的秘钥 */
private static String secretKey = "***********************";
/** 存储桶名称 */
private static String bucketName = "****";
private static MinioClient client = MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
/**
* @param file 上传的文件
* @return 访问地址
*/
public static String uploadFile(MultipartFile file) throws Exception {
String fileName = uuidFileName(file); //对文件名进行编码
PutObjectArgs args = PutObjectArgs.builder()
.bucket(bucketName) //储存桶名称
.object(fileName) //文件路径加文件名
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build();
client.putObject(args); //上传文件
//返回上传的路径
return url + "/" + bucketName + "/" + fileName;
}
/**
* 判断桶是否存在
* @param bucketName 桶名称
* @throws Exception
*/
public static boolean bucketExists(String bucketName) throws Exception {
return client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
}
/**
* 获取一个新的文件名
*/
private static String uuidFileName(MultipartFile file){
//获取文件名称 a.txt.jpg
String filename = file.getOriginalFilename();
//得到一个uuid随机的字符串
String uuid = UUID.randomUUID().toString();
//uuid和文件的后缀名称拼接得到一个新的文件名称 aaaaa.jpg
String newFileName = uuid+filename.substring(filename.lastIndexOf("."));
//uuid和文件的后缀名称拼接得到一个新的文件名称
return newFileName;
}
}
应用
@PostMapping("/testUpload")
public AjaxResult testUpload(@RequestParam("file")MultipartFile file){
try{
String s = MinioUtil.uploadFile(file);
return AjaxResult.success(s);
}catch (Throwable e){
StaticLog.error(e);
throw new GlobalException();
}
}