赞
踩
Minio是一个开源的对象存储服务器,可以用来存储和管理大规模的数据。我们可以用它来存储图片或者视频资源。
托管方式:MinIO 是一个开源的对象存储系统,可以在自己的服务器或云环境中进行部署和管理。而阿里云 OSS 是由阿里云提供的托管服务,不需要自己购买服务器或进行部署。
成本:MinIO 是一个开源项目,可以免费使用,您只需要支付服务器和网络等基础设施的费用。而阿里云 OSS 是一个收费的云服务,费用根据存储容量、数据传输和访问次数等因素而定。
功能和性能:阿里云 OSS 是一个经过大规模使用和测试的云存储服务,提供了丰富的功能和高可用性。MinIO 也提供了类似的功能,并专注于提供高性能和低延迟的对象存储服务。
数据保护和备份:阿里云 OSS 提供了多层次的数据冗余和备份机制,以确保数据的安全性和可用性。MinIO 也提供了类似的数据冗余和备份机制,但需要用户自行配置和管理。
地理位置和可用区:阿里云 OSS 在全球范围内提供了多个地理位置和可用区来存储数据,以满足用户的需求。MinIO 则需要用户自行设置多个节点并进行数据的分布式存储。
总结:如果想要免费但折腾的话,可以考虑minio;如果不介意收费的话,肯定选择专业且服务周到的云服务。(当然,minio也提供商业技术服务)。
注:Minio 完全兼容AWS S3协议。这意味着你可以使用Minio API来访问和操作AWS S3服务;同时,你也可以使用S3API来访问Minio服务器。
从官网下载Minio的二进制文件,点击前往--》 https://min.io
或者中文版--》https://www.minio.org.cn/
下载之后,新建一个文件夹,用于存储文件(例如叫database)。新建一个批处理脚本start.bat。点击启动服务器。
- minio.exe server E:\minio\database\
- pause
- mkdir mioio && cd minio
- mkdir config
- mkdir data
- docker pull minio/minio
- docker run -d -p 9000:9000 -p 9001:9001 --name minio -v ./data:/data -v ./config:/root/.minio -e "MINIO_ROOT_USER=minio" -e "MINIO_ROOT_PASSWORD=minio123456" minio/minio server /data --console-address ":9001"
打开浏览器,输入Minio服务器的地址和端口(默认为http://localhost:9000),账户密码默认是minioadmin。
在Minio的Web界面上,找到"Bucket"按钮,输入存储桶的名称,并选择存储桶的区域和访问权限等。
官方为部分语言提供了操作的sdk,下面以java作为演示
只需导入官方提供的依赖即可
- <dependency>
- <groupId>io.minio</groupId>
- <artifactId>minio</artifactId>
- <version>8.5.9</version>
- </dependency>
官网对API提供了非常详细的例子,传送门 --> minio Java API
- 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;
- }
使用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();
- }
-
- }
对原生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管理后台处理了,这里就不做演示了。这里重点演示下文件上传功能。
- 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);
- }
- }
在管理后台可以看到新上传的文件
使用浏览器访问文件,发现访问被拒绝
默认情况,minio提供的getPresignedObjectUrl()只提供一个有期限(默认七天)的下载url。若要永久url,有几种方法。
1.把过期时间设置得非常长,近似永久;
2.设置桶的访问正常为Public,允许任何人读写
3.为其他人设置只读权限(对外永久可读权限在业务允许范围,例如常见博客文章里的图片url)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。