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


欢迎加群交流技术

前言
由于项目业务发展,文件上传直接保存到服务器的弊端越来越多。后面采用了分布式的文件上传,因为是内网的,所以上网找了很久,发现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("文件下载时,出现错误,请检查文件服务器");
- }
- }
调用文件上传后,去文件服务器查看
评价