菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

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

3975人阅读 2023/6/21 14:10 总访问:971790 评论:0 收藏:1 手机
分类: 文件流

前言

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



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


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

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


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

  1. 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 

  1.             //链接分布式文件系统
  2.             services.AddSingleton(x => new MinioClient("ip地址:9000""root""nk@123456"));

代码

  1.   private readonly MinioClient _minioClient;
  2.   
  3.          public FileService(MinioClient minioClient)
  4.         {
  5.             _minioClient = minioClient; 
  6.         }
  7.          /// <summary>
  8.         /// 存储桶名称
  9.         /// </summary>
  10.         private const string BucketName = "nk5";
  11.         
  12.         //将文件上传到minio
  13.           public async Task<List<string>> UploadFileAsync(List<IFormFile> files)
  14.         {
  15.             // 验证文件是否存在
  16.             (files.Count == 0).ThrowExceptionByResult("文件不能为空");
  17.             var list = new List<string>();
  18.             //校验桶是否存在,不存在则创建一个桶
  19.             if (!await _minioClient.BucketExistsAsync(BucketName))
  20.             {
  21.                 await _minioClient.MakeBucketAsync(BucketName);
  22.             }
  23.             foreach (var file in files)
  24.             {
  25.                 // 上传文件到MinIO
  26.                 await using var stream = file.OpenReadStream();
  27.                 list.Add(file.FileName);
  28.                 await _minioClient.PutObjectAsync(BucketName, file.FileName, stream, stream.Length, file.ContentType);
  29.             }
  30.             return list;
  31.         }
  32.         //根据指定桶的文件名获取文件
  33.         public async Task<MemoryStream> DownloadFileAsync(string fileName)
  34.         {
  35.             (!await _minioClient.BucketExistsAsync(BucketName)).ThrowExceptionByResult("未找到存储桶");
  36.             try
  37.             {
  38.                 var dataStream = new MemoryStream();
  39.                 await _minioClient.GetObjectAsync(BucketName, fileName, (stream) =>
  40.                 {
  41.                     stream.CopyTo(dataStream);
  42.                 });
  43.                 dataStream.Position = 0;
  44.                 return dataStream;
  45.             }
  46.             catch (Exception ex)
  47.             {
  48.                 throw new Exception("文件下载时,出现错误,请检查文件服务器");
  49.             }
  50.         }

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

评价

NET Core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

使用OLEDB读取不同版本Excel的连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

C 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下:...

使用爬虫刷csdn博客访问量

首先了解一下常见反爬虫的检测方法频率监测:有些网站会设置一种频率监测的机制,对于同一IP,若在一定时间内访问的速度超...

Idea下使用maven搭建SSM(一):SpringMVC

Spring MVC是一款基于MVC架构模式的轻量级Web框架,其目的是将Web开发模块化,对整体架构进行解耦,简化Web开发流程。下面...

Idea下使用maven搭建SSM(二):MyBatis

开发Web应用,数据的存储和处理往往离不开数据库和SQL语句。在使用Java开发的Web应用中,自然也少不了连接数据库的步骤。在...

使用 微软自带语音合成类库

//引入语音合成名称空间 usingSystem.Speech.Synthesis; classA { voidtest1() { //实例化并指定字符串播放合成读音 ...

如何使用图标像使用文字一样,使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务,提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

使用OutLook发送邮件

publicstaticvoidOutlook(stringSubject,stringTextBody,stringFromAdd,stringFromPass,stringTo,stringCC,List&lt;string&...

SQL Server 中使用游标

--声明一个游标 DECLAREMyCursorCURSOR FORSELECTTOP5FBookName,FBookCodingFROMTBookInfo//定义一个叫MyCursor的游标,...

Windows使用wireshark抓包小心得

wireshrak是个网络抓包工具,常用。但是在数据较大的网络环境中直接使用软件抓包会导致wireshark卡死。为什么呢 ?网卡瞬间...

Oracle自定义函数的简单使用

一.最最最简单的返回一个数字的函数createorreplacefunctionfun_show returnint--申明返回值 as begin return1; end;...

Oracle事务的简单使用

事务:  事务是一个整体,这些操作要么全部执行成功,要么全部不执行。使用事务的原因:保证数据的安全有效。事务的四个特...

Oracle使用游标

其实游标就是把查询的结果放入游标中,然后在去游标里边读取。相当于使用游标做了一个中转,而游标是可以作为参数进行传递...