Minio是一个开源的对象存储服务器,可以用来存储和管理大规模的数据。我们可以用它来存储图片或者视频资源。
minio和阿里云(腾讯云、百度云等)oss对比
-
托管方式:MinIO 是一个开源的对象存储系统,可以在自己的服务器或云环境中进行部署和管理。而阿里云 OSS 是由阿里云提供的托管服务,不需要自己购买服务器或进行部署。
-
成本:MinIO 是一个开源项目,可以免费使用,您只需要支付服务器和网络等基础设施的费用。而阿里云 OSS 是一个收费的云服务,费用根据存储容量、数据传输和访问次数等因素而定。
-
功能和性能:阿里云 OSS 是一个经过大规模使用和测试的云存储服务,提供了丰富的功能和高可用性。MinIO 也提供了类似的功能,并专注于提供高性能和低延迟的对象存储服务。
-
数据保护和备份:阿里云 OSS 提供了多层次的数据冗余和备份机制,以确保数据的安全性和可用性。MinIO 也提供了类似的数据冗余和备份机制,但需要用户自行配置和管理。
-
地理位置和可用区:阿里云 OSS 在全球范围内提供了多个地理位置和可用区来存储数据,以满足用户的需求。MinIO 则需要用户自行设置多个节点并进行数据的分布式存储。
总结:如果想要免费但折腾的话,可以考虑minio;如果不介意收费的话,肯定选择专业且服务周到的云服务。(当然,minio也提供商业技术服务)
1.安装运行Minio
1.1安装minio
从官网下载Minio的二进制文件,点击前往--》 https://min.io
或者中文版--》https://www.minio.org.cn/
笔者使用的是windows版本,下载之后,新建一个文件夹,用于存储文件(例如叫database)。新建一个批处理脚本start.bat。点击启动服务器。
minio.exe server E:\minio\database\
pause
1.2运行minio
1.2.1访问Minio的Web界面
打开浏览器,输入Minio服务器的地址和端口(默认为http://localhost:9000),账户密码默认是minioadmin。
1.2.2创建存储桶
在Minio的Web界面上,找到"Bucket"按钮,输入存储桶的名称,并选择存储桶的区域和访问权限等。
1.2.3创建accesskey
2.使用springboot操作minio
官方为部分语言提供了操作的sdk,下面以java作为演示
只需导入官方提供的依赖即可
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.9</version>
</dependency>
2.1springboot封装API工具
官网对API提供了非常详细的例子,传送门 --> minio Java API
2.1.1使用@ConfigurationProperties配置minio
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "minio")
@Data
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucket;
}
2.1.2创建MinioClient对象
使用MinioProperties属性值创建MinioClient对象
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinioConfigs {
@Autowired
private MinioProperties properties;
@Bean
public MinioClient createClient() {
return MinioClient.builder()
.endpoint(properties.getEndpoint())
.credentials(properties.getAccessKey(), properties.getSecretKey())
.build();
}
}
2.1.3封装操作bucket和上传/下载文件API
对原生MinioClient对象的操作进行封装,所有名字叫Proxy,简化API。
import io.minio.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
@Component
public class MinIoClientProxy {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioProperties minioProperties;
public void createBucket(String name) throws IOException {
try {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
} catch (Exception e) {
throw new IOException(e);
}
}
public void removeBucket(String name) throws IOException {
try {
minioClient.removeBucket(RemoveBucketArgs.builder().bucket(name).build());
} catch (Exception e) {
throw new IOException(e);
}
}
public boolean containsBucket(String name) throws IOException {
try {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
} catch (Exception e) {
throw new IOException(e);
}
}
public String upload(InputStream input, String fileName) throws IOException {
String saveName = fileName; //TODO 这里需要对文件名进行转换,避免明文存储
try {
minioClient.putObject(
PutObjectArgs.builder()
.bucket(minioProperties.getBucket())
.object(saveName).stream(input, input.available(), -1)
.build());
return getFileUrl(fileName);
} catch (Exception e) {
throw new IOException(e);
}
}
public String getFileUrl(String filePath) {
return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + filePath;
}
public InputStream InputStream(String fileName) throws IOException {
GetObjectArgs request = GetObjectArgs.builder().bucket(minioProperties.getBucket()).object(fileName).build();
try {
return minioClient.getObject(request);
} catch (Exception e) {
throw new IOException(e);
}
}
public void remove(String objectName) throws IOException {
RemoveObjectArgs request = RemoveObjectArgs.builder().bucket(minioProperties.getBucket()).object(objectName).build();
try {
minioClient.removeObject(request);
} catch (Exception e) {
throw new IOException(e);
}
}
}
对bucket的相关操作,已经在minio管理后台处理了,这里就不做演示了。这里重点演示下文件上传功能。
2.1.4使用测试代码上传文件
public class AdminStartup {
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(AdminStartup.class);
app.setBannerMode(Banner.Mode.OFF);
app.run(args);
MinIoClientProxy minioClient = SpringContext.getBean(MinIoClientProxy.class);
InputStream is = new FileInputStream(new File("E:/testfile.jar"));
String url = minioClient.upload(is, "testfile.jar");
System.out.println("file url is " + url);
}
}
在管理后台可以看到新上传的文件
使用浏览器访问文件,发现访问被拒绝
2.1.5文件下载可读url
默认情况,minio提供的getPresignedObjectUrl()只提供一个有期限(默认七天)的下载url。若要永久url,有几种方法。
1.把过期时间设置得非常长,近似永久;
2.设置桶的访问正常为Public,允许任何人读写
3.为其他人设置只读权限(对外永久可读权限在业务允许范围,例如常见博客文章里的图片url)
标签:minio,new,String,IOException,import,服务器,搭建,public,Minio From: https://blog.csdn.net/littleschemer/article/details/136687773