图床是用来存储和分享图片的一种在线服务。在实际应用中,图床正好满足这样的需求,通过将图片上传到图床上,我们不仅可以在多个平台上随时引用这些图片,还可以方便地管理和分享这些图片资源。
另外,使用图床还可以大大减轻服务器的存储压力,因为图片占用的存储资源较大,如果直接保存在服务器上,会导致存储压力过大。将图片资源可以保存在自己的指定位置,更加安全
我们一般可以使用阿里云的oss也可以自己搭建minio来存储图片资源,下面我们看看如何去搭建自己的图床,这里我主要演示minio,来记录自己的搭建过程
Minio 是一个开源的对象存储服务器,支持 Amazon S3 API。它可以将不同的存储后端,例如本地文件系统抽象成一个统一的对象存储服务,并提供对标准 S3 API 的支持。
使用 Minio,你可以轻松搭建一个高可用、高可靠和高性能的对象存储服务,用于存储和处理海量数据。
关于minioWeb页面国际化:https://github.com/minio/console/issues/860
按照如下命令无脑操作即可
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 &
<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>8.2.1version>
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;
}
/**
* 创建存储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;
}