当前位置:   article > 正文

使用Minio搭建文件服务器_开源的文件服务器

开源的文件服务器

Minio是一个开源的对象存储服务器,可以用来存储和管理大规模的数据。我们可以用它来存储图片或者视频资源。

minio和阿里云(腾讯云、百度云等)oss对比

  1. 托管方式:MinIO 是一个开源的对象存储系统,可以在自己的服务器或云环境中进行部署和管理。而阿里云 OSS 是由阿里云提供的托管服务,不需要自己购买服务器或进行部署。

  2. 成本:MinIO 是一个开源项目,可以免费使用,您只需要支付服务器和网络等基础设施的费用。而阿里云 OSS 是一个收费的云服务,费用根据存储容量、数据传输和访问次数等因素而定。

  3. 功能和性能:阿里云 OSS 是一个经过大规模使用和测试的云存储服务,提供了丰富的功能和高可用性。MinIO 也提供了类似的功能,并专注于提供高性能和低延迟的对象存储服务。

  4. 数据保护和备份:阿里云 OSS 提供了多层次的数据冗余和备份机制,以确保数据的安全性和可用性。MinIO 也提供了类似的数据冗余和备份机制,但需要用户自行配置和管理。

  5. 地理位置和可用区:阿里云 OSS 在全球范围内提供了多个地理位置和可用区来存储数据,以满足用户的需求。MinIO 则需要用户自行设置多个节点并进行数据的分布式存储。

总结:如果想要免费但折腾的话,可以考虑minio;如果不介意收费的话,肯定选择专业且服务周到的云服务。(当然,minio也提供商业技术服务)。

注:Minio 完全兼容AWS S3协议。这意味着你可以使用Minio API来访问和操作AWS S3服务;同时,你也可以使用S3API来访问Minio服务器。

1.安装运行Minio

1.1windows安装minio

从官网下载Minio的二进制文件,点击前往--》 https://min.io

或者中文版--》https://www.minio.org.cn/

下载之后,新建一个文件夹,用于存储文件(例如叫database)。新建一个批处理脚本start.bat。点击启动服务器

  1. minio.exe server E:\minio\database\
  2. pause

1.2docker安装minio

  1. mkdir mioio && cd minio
  2. mkdir config
  3. mkdir data
  4. docker pull minio/minio
  5. 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"

1.3运行minio

1.3.1访问Minio的Web界面

打开浏览器,输入Minio服务器的地址和端口(默认为http://localhost:9000),账户密码默认是minioadmin。

1.3.2创建存储桶

在Minio的Web界面上,找到"Bucket"按钮,输入存储桶的名称,并选择存储桶的区域和访问权限等。

1.3.3创建accesskey

2.使用springboot操作minio

官方为部分语言提供了操作的sdk,下面以java作为演示

只需导入官方提供的依赖即可

  1. <dependency>
  2. <groupId>io.minio</groupId>
  3. <artifactId>minio</artifactId>
  4. <version>8.5.9</version>
  5. </dependency>

2.1springboot封装API工具

官网对API提供了非常详细的例子,传送门 --> minio Java API

2.1.1使用@ConfigurationProperties配置minio

  1. import lombok.Data;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.context.annotation.Configuration;
  4. @Configuration
  5. @ConfigurationProperties(prefix = "minio")
  6. @Data
  7. public class MinioProperties {
  8. private String endpoint;
  9. private String accessKey;
  10. private String secretKey;
  11. private String bucket;
  12. }

2.1.2创建MinioClient对象

使用MinioProperties属性值创建MinioClient对象

  1. import io.minio.MinioClient;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. @Configuration
  6. public class MinioConfigs {
  7. @Autowired
  8. private MinioProperties properties;
  9. @Bean
  10. public MinioClient createClient() {
  11. return MinioClient.builder()
  12. .endpoint(properties.getEndpoint())
  13. .credentials(properties.getAccessKey(), properties.getSecretKey())
  14. .build();
  15. }
  16. }

 2.1.3封装操作bucket和上传/下载文件API

对原生MinioClient对象的操作进行封装,所以名字叫Proxy,简化API。

  1. import io.minio.*;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. @Component
  7. public class MinIoClientProxy {
  8. @Autowired
  9. private MinioClient minioClient;
  10. @Autowired
  11. private MinioProperties minioProperties;
  12. public void createBucket(String name) throws IOException {
  13. try {
  14. minioClient.makeBucket(MakeBucketArgs.builder().bucket(name).build());
  15. } catch (Exception e) {
  16. throw new IOException(e);
  17. }
  18. }
  19. public void removeBucket(String name) throws IOException {
  20. try {
  21. minioClient.removeBucket(RemoveBucketArgs.builder().bucket(name).build());
  22. } catch (Exception e) {
  23. throw new IOException(e);
  24. }
  25. }
  26. public boolean containsBucket(String name) throws IOException {
  27. try {
  28. return minioClient.bucketExists(BucketExistsArgs.builder().bucket(name).build());
  29. } catch (Exception e) {
  30. throw new IOException(e);
  31. }
  32. }
  33. public String upload(InputStream input, String fileName) throws IOException {
  34. String saveName = fileName; //TODO 这里需要对文件名进行转换,避免明文存储
  35. try {
  36. minioClient.putObject(
  37. PutObjectArgs.builder()
  38. .bucket(minioProperties.getBucket())
  39. .object(saveName).stream(input, input.available(), -1)
  40. .build());
  41. return getFileUrl(fileName);
  42. } catch (Exception e) {
  43. throw new IOException(e);
  44. }
  45. }
  46. public String getFileUrl(String filePath) {
  47. return minioProperties.getEndpoint() + "/" + minioProperties.getBucket() + "/" + filePath;
  48. }
  49. public InputStream InputStream(String fileName) throws IOException {
  50. GetObjectArgs request = GetObjectArgs.builder().bucket(minioProperties.getBucket()).object(fileName).build();
  51. try {
  52. return minioClient.getObject(request);
  53. } catch (Exception e) {
  54. throw new IOException(e);
  55. }
  56. }
  57. public void remove(String objectName) throws IOException {
  58. RemoveObjectArgs request = RemoveObjectArgs.builder().bucket(minioProperties.getBucket()).object(objectName).build();
  59. try {
  60. minioClient.removeObject(request);
  61. } catch (Exception e) {
  62. throw new IOException(e);
  63. }
  64. }
  65. }

对bucket的相关操作,已经在minio管理后台处理了,这里就不做演示了。这里重点演示下文件上传功能。

2.1.4使用测试代码上传文件

  1. public class AdminStartup {
  2. public static void main(String[] args) throws Exception {
  3. SpringApplication app = new SpringApplication(AdminStartup.class);
  4. app.setBannerMode(Banner.Mode.OFF);
  5. app.run(args);
  6. MinIoClientProxy minioClient = SpringContext.getBean(MinIoClientProxy.class);
  7. InputStream is = new FileInputStream(new File("E:/testfile.jar"));
  8. String url = minioClient.upload(is, "testfile.jar");
  9. System.out.println("file url is " + url);
  10. }
  11. }

 在管理后台可以看到新上传的文件

使用浏览器访问文件,发现访问被拒绝

2.1.5文件下载可读url

默认情况,minio提供的getPresignedObjectUrl()只提供一个有期限(默认七天)的下载url。若要永久url,有几种方法。

1.把过期时间设置得非常长,近似永久;

2.设置桶的访问正常为Public,允许任何人读写

3.为其他人设置只读权限(对外永久可读权限在业务允许范围,例如常见博客文章里的图片url)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/752949
推荐阅读
相关标签
  

闽ICP备14008679号