minio图床搭建流程
前言
图床是用来存储和分享图片的一种在线服务。在实际应用中,图床正好满足这样的需求,通过将图片上传到图床上,我们不仅可以在多个平台上随时引用这些图片,还可以方便地管理和分享这些图片资源。
另外,使用图床还可以大大减轻服务器的存储压力,因为图片占用的存储资源较大,如果直接保存在服务器上,会导致存储压力过大。将图片资源可以保存在自己的指定位置,更加安全
技术选型
我们一般可以使用阿里云的oss也可以自己搭建minio来存储图片资源,下面我们看看如何去搭建自己的图床,这里我主要演示minio,来记录自己的搭建过程
Minio
Minio 是一个开源的对象存储服务器,支持 Amazon S3 API。它可以将不同的存储后端,例如本地文件系统抽象成一个统一的对象存储服务,并提供对标准 S3 API 的支持。
使用 Minio,你可以轻松搭建一个高可用、高可靠和高性能的对象存储服务,用于存储和处理海量数据。
关于minioWeb页面国际化:https://github.com/minio/console/issues/860
优点
- 简单易用:Minio 的命令行工具和 Web 管理界面非常简单易用,具有良好的用户体验和开箱即用的特性。
- 高度可扩展:Minio 可以通过分布式架构扩展到数百个节点,以实现更好的性能和容错能力。
- 开放源代码:Minio 是一个开放源代码的项目,具有强大的社区支持和活跃的开发者社区。
- 安全性:Minio 支持多种加密方式和身份验证机制,可以确保数据安全和隐私保护
服务器搭建步骤
按照如下命令无脑操作即可
下载和安装
mkdir -p /home/minio
cd /home/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
配置(密钥、日志、存储空间)
# 给minio赋权
chmod +x minio
# 设置用户名、密码
export MINIO_ACCESS_KEY=minioadmin
export MINIO_SECRET_KEY=minioadmin
# 创建存储目录及日志文件
mkdir -p /home/minio/data
cd /home/minio/data
# 创建日志文件
touch minio.log
启动
cd /home/minio
nohup ./minio server --address '0.0.0.0:9000' --console-address '0.0.0.0:9999' /home/minio/data >/home/minio/data/minio.log 2>&1 &
JavaJDK
Xml
<!--minio-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
配置使用路径
@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
/**
* 服务地址
*/
public String url;
/**
* 用户名
*/
public String accessKey;
/**
* 密码
*/
public String secretKey;
/**
* 存储桶名称
*/
public String bucketName;
// "如果是true,则用的是https而不是http,默认值是true"
public static Boolean secure = false;
@Bean
public MinioClient getMinioClient() {
return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
}
}
工具类
在这个工具类中我们先定义三个方法
@Component
public class MinioUtil {
@Autowired
private MinioClient minioClient;
}
- 查看桶是否存在
/**
* 查询bucket中是否已经存在
*
* @param bucketName 桶名
* @return 是否存在
*/
public Boolean bucketExists(String bucketName) {
Boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs
.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return found;
}
- 创建桶
web页面直接点击按钮创建即可,这里就不去展示了,下面演示使用java中的SDK去实现创建bucket(这里看不懂的可以去看看Fluent API 的思想)
/**
* 创建存储bucket
*
* @param bucket 桶名
* @return 是否创建成功
*/
public Boolean makeBucket(String bucket) {
try {
minioClient.makeBucket(MakeBucketArgs
.builder()
.bucket(bucket)
.build());
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
- 上传文件
/**
* 文件上传
* @param file 文件路径
* @param fileName 存储的bucket
* @param bucketName 文件名
* @return 是否上传成功
*/
public Boolean upload(InputStream file, String fileName, String bucketName){
try {
PutObjectArgs objectArgs = PutObjectArgs
.builder()
.bucket(bucketName)
.object(fileName)
// 将分块大小设置为 10MB
.stream(file, -1, 10485760L)
//这里如果是上传其他的文件,可以使用api去获取到其他文件的格式
.contentType("image/jpeg")
.build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
上传图片实战
下面我还是将这个封装了一个上传本地图片的方法
- 这里先注入一下配置信息
@Autowired
private MinioUtil minioUtil;
@Autowired
private MinioConfig minioConfig;
- 工具方法(这里使用前面一些工具类里面的方法)
/**
* 根据传入的文件路径去返回生成的图片
*
* @param fileUrl 图片路径
* @return 网络地址
*/
public String uploadFileMinio(String fileUrl) {
boolean flag = false;
// 判断存储桶是否存在
if (!minioUtil.bucketExists(minioConfig.getBucketName())) {
minioUtil.makeBucket(minioConfig.getBucketName());
}
// 生成文件名
String fineName = fileUrl.substring(fileUrl.length() - 8, fileUrl.length() - 4);
try {
File file = new File(fileUrl);
InputStream inputStream = new FileInputStream(file);
// 上传文件
flag = minioUtil.upload(inputStream, fineName, minioConfig.getBucketName());
} catch (Exception e) {
return null;
}
// 判断是否上传成功,成功就返回url,不成功就返回null
if (flag) {
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fineName;
}
return null;
}