使用minio 实现分布式文件上传

前言

由于项目业务发展,文件上传直接保存到服务器的弊端越来越多。后面采用了分布式的文件上传,因为是内网的,所以上网找了很久,发现minio这个开源分布式文件系统。但是收不收费还不确定。后面去网上查了一下,minio 近两年协议换成了GUN AGPL v3。然后我又去搜了一下,这个协议想要免费使用,就得把自己的项目也开源。否则要么乖乖交钱,要么吃官司。

 



后边在网上找到了 apache 协议的 minio 。这下终于不收费了
 



找到了之后,直接下载压缩包,或者使用命令下载镜像
 

docker pull minio/minio:RELEASE.2021-02-01T22-56-52Z


下载完成后,使用命令将minio 启动,其中 -v 是将mino  的文件存放映射到服务器本机,而不是直接放在docker 容器里
 

docker run -d -p 9000:9000 -e "MINIO_ROOT_USER=root" -e "MINIO_ROOT_USER=nk@123456" -v F:\miniodata:/data   minio/minio:RELEASE.2021-02-01T22-56-52Z server /data

使用设置好的账号密码登陆
 



现在minio 成功启动,在代码中添加minio  的包。

 


添加完成后,注入minio 
 

   //链接分布式文件系统

           services.AddSingleton(x => new MinioClient("ip地址:9000", "root", "nk@123456"));

代码

private readonly MinioClient _minioClient;
  
         public FileService(MinioClient minioClient)
        {
            _minioClient = minioClient; 
        }
         /// <summary>
        /// 存储桶名称
        /// </summary>
        private const string BucketName = "nk5";
        
        //将文件上传到minio
          public async Task<List<string>> UploadFileAsync(List<IFormFile> files)
        {
            // 验证文件是否存在
            (files.Count == 0).ThrowExceptionByResult("文件不能为空");

            var list = new List<string>();

            //校验桶是否存在,不存在则创建一个桶
            if (!await _minioClient.BucketExistsAsync(BucketName))
            {
                await _minioClient.MakeBucketAsync(BucketName);
            }

            foreach (var file in files)
            {
                // 上传文件到MinIO
                await using var stream = file.OpenReadStream();
                list.Add(file.FileName);
                await _minioClient.PutObjectAsync(BucketName, file.FileName, stream, stream.Length, file.ContentType);
            }
            return list;
        }
        //根据指定桶的文件名获取文件
        public async Task<MemoryStream> DownloadFileAsync(string fileName)
        {
            (!await _minioClient.BucketExistsAsync(BucketName)).ThrowExceptionByResult("未找到存储桶");

            try
            {
                var dataStream = new MemoryStream();
                await _minioClient.GetObjectAsync(BucketName, fileName, (stream) =>
                {
                    stream.CopyTo(dataStream);
                });

                dataStream.Position = 0;
                return dataStream;
            }
            catch (Exception ex)
            {
                throw new Exception("文件下载时,出现错误,请检查文件服务器");
            }
        }

调用文件上传后,去文件服务器查看

相关推荐

  1. OSS文件MinIO分布式文件存储系统

    2024-05-09 08:08:09       50 阅读
  2. vue3+springboot+minio实现文件功能

    2024-05-09 08:08:09       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 08:08:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 08:08:09       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 08:08:09       82 阅读
  4. Python语言-面向对象

    2024-05-09 08:08:09       91 阅读

热门阅读

  1. 【linux】隐藏文件,vim 或 gedit 打开隐藏文件

    2024-05-09 08:08:09       30 阅读
  2. 探索九型人格测试API接口:神奇之处暗藏何处?

    2024-05-09 08:08:09       27 阅读
  3. Amazon IoT 服务的组件

    2024-05-09 08:08:09       33 阅读
  4. docker安装部署FastGPT

    2024-05-09 08:08:09       29 阅读
  5. selenium 同样的class如何选择第二个

    2024-05-09 08:08:09       32 阅读
  6. C#语言进阶(四) 枚举器和迭代器

    2024-05-09 08:08:09       35 阅读
  7. Spring Boot配置类实例讲解

    2024-05-09 08:08:09       34 阅读
  8. git 常用命令及注释

    2024-05-09 08:08:09       25 阅读
  9. Github 2024-05-08 开源项目日报 Top10

    2024-05-09 08:08:09       39 阅读
  10. git对远程和本地分支进行重命名

    2024-05-09 08:08:09       30 阅读
  11. mybatis使用及配置相关,仅做个人记录

    2024-05-09 08:08:09       40 阅读