一、minio下载与启动

下载后会有一个minio.exe文件,放到指定的目录

在该目录下运行:minio.exe server D:\minio\file  出现如下的提示代码启动动成功:

浏览器中输入:http://127.0.0.1:9000/  进入minio登录页面 用户名密码:minioadmin    minioadmin

可以看到我在桶omsfile中上传了两个文件

二、.netcore中集成

1、引入Nuget包  Minio.AspNetCore

2、配置json文件

"Minio": {
"Endpoint": "127.0.0.1:9000",
"Region": "127.0.0.1",
"AccessKey": "minioadmin",
"SecretKey": "minioadmin",
"BucketName": "omsfile",
"FileURL": "http://127.0.0.1:9000/file"
}

3、添加服务

services.AddMinio(options =>
{ options.Endpoint = Configuration["Minio:Endpoint"]; // 这里是在配置文件接口访问域名
options.Region = Configuration["Minio:Region"]; // 地址
options.AccessKey = Configuration["Minio:AccessKey"]; // 用户名
options.SecretKey = Configuration["Minio:SecretKey"]; // 密码 });

4、服务接口 IMinIOService

  public interface IMinIOService
{
/// <summary>
/// 上传
/// </summary>
/// <param name="file">文件</param>
/// <returns></returns>
Task<Result<FileModel>> UploadAsync(FormFileCollection file); /// <summary>
/// 上传图片
/// </summary>
/// <param name="file">文件</param>
/// <returns></returns> Task<Result<FileModel>> UploadImageAsync(FormFileCollection file); /// <summary>
/// 上传pdf
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
Task<Result<FileModel>> UploadPdf(Stream file);
}

5、服务接口实现 MinIOService

/// <summary>
/// 上传文件相关
/// </summary>
public class MinIOService : IMinIOService
{
public AppSetting _settings { get; }
public IHostingEnvironment _hostingEnvironment { get; set; }
public MinioClient _client { get; set; }
public MinioOptions _minioOptions { get; set; }
public MinIOService(IOptions<AppSetting> setting, IHostingEnvironment hostingEnvironment, MinioClient client, IOptions<MinioOptions> minioOptions)
{
_settings = setting.Value;
_hostingEnvironment = hostingEnvironment;
_client = client;
_minioOptions = minioOptions.Value;
}
//获取图片的返回类型
public static Dictionary<string, string> contentTypDict = new Dictionary<string, string> {
{"bmp","image/bmp" },
{"jpg","image/jpeg"},
{"jpeg","image/jpeg"},
{"jpe","image/jpeg"},
{"png","image/png"},
{"gif","image/gif"},
{"ico","image/x-ico"},
{"tif","image/tiff"},
{"tiff","image/tiff"},
{"fax","image/fax"},
{"wbmp","image//vnd.wap.wbmp"},
{"rp","image/vnd.rn-realpix"} }; /// <summary>
/// 上传图片
/// </summary>
/// <param name="file">文件</param>
/// <returns></returns> public async Task<Result<FileModel>> UploadImageAsync(FormFileCollection file)
{
Result<FileModel> res = new Result<FileModel>(false, "上传失败"); //获得文件扩展名
string fileNameEx = System.IO.Path.GetExtension(file[0].FileName).Replace(".", ""); //是否是图片,现在只能是图片上传 文件类型 或扩展名不一致则返回
if (contentTypDict.Values.FirstOrDefault(c => c == file[0].ContentType.ToLower()) == null || contentTypDict.Keys.FirstOrDefault(c => c == fileNameEx) == null)
{
res.Msg = "图片格式不正确";
return res;
}
else
return await UploadAsync(file);
} /// <summary>
/// 上传
/// </summary>
/// <param name="file">文件</param>
/// <returns></returns> public async Task<Result<FileModel>> UploadAsync(FormFileCollection file)
{
Result<FileModel> res = new Result<FileModel>(false, "上传失败"); try
{ //存储桶名
string bucketName = _settings.BucketName; Zhengwei.Minio.FileModel fileModel = new FileModel();
await CreateBucket(bucketName);
var newFileName = CreateNewFileName(bucketName, file[0].FileName);
await _client.PutObjectAsync(bucketName, newFileName, file[0].OpenReadStream(), file[0].Length,
file[0].ContentType);
fileModel.Url = $"{_settings.FileURL}{newFileName}"; //是否是图片,是图片进行压缩
if (contentTypDict.Values.Contains(file[0].ContentType.ToLower()))
{
string path = $"{_hostingEnvironment.ContentRootPath}/wwwroot/imgTemp/";
if (!Directory.Exists(Path.GetDirectoryName(path)))
Directory.CreateDirectory(Path.GetDirectoryName(path)); var bImageName = $"{newFileName}";
var savepath = $"{path}{newFileName}";//保存绝对路径
#region 保存原图到本地
using (FileStream fs = System.IO.File.Create(path + newFileName))
{
file[0].CopyTo(fs);
fs.Flush();
}
#endregion //#region 保存缩略图到本地
//var bUrlRes = TencentCloudImageHelper.GetThumbnailImage(240, newFileName, path);
//#endregion //上传压缩图 using (var sw = new FileStream(savepath, FileMode.Open))
{
await _client.PutObjectAsync(bucketName, bImageName, sw, sw.Length,
"image/jpeg");
fileModel.Url = $"{_settings.FileURL}{bImageName}";
} if (Directory.Exists(Path.GetDirectoryName(path)))
Directory.Delete(Path.GetDirectoryName(path), true); }
res.IsSuccess = true;
res.Msg = "上传成功";
res.Data = fileModel;
return res;
}
catch (Exception e)
{ return res;
}
} public async Task<Result<FileModel>> UploadPdf(Stream file)
{
Result<FileModel> res = new Result<FileModel>(false, "上传失败");
try
{ //存储桶名
string bucketName = _settings.BucketName; FileModel fileModel = new FileModel();
await CreateBucket(bucketName);
var newFileName = CreateNewFileName(bucketName, "授权书.pdf");
await _client.PutObjectAsync(bucketName, newFileName, file, file.Length,
"application/pdf");
fileModel.Url = $"{_settings.FileURL}{newFileName}"; res.IsSuccess = true;
res.Msg = "上传成功";
res.Data = fileModel;
return res;
}
catch (Exception e)
{ return res;
}
} private async Task CreateBucket(string bucketName)
{
var found = await _client.BucketExistsAsync(bucketName);
if (!found)
{
await _client.MakeBucketAsync(bucketName);
//设置只读策略
var pObj = new
{
Version = "2012-10-17",
Statement = new[]
{
new
{
Effect = "Allow",
Principal = new
{
AWS = new [] {"*"}
},
Action = new [] {"s3:GetBucketLocation", "s3:ListBucket"},
Resource = new []
{
$"arn:aws:s3:::{bucketName}"
}
},
new
{
Effect = "Allow",
Principal = new
{
AWS = new [] {"*"}
},
Action = new [] {"s3:GetObject"},
Resource = new []
{
$"arn:aws:s3:::{bucketName}/*"
}
}
}
};
var po = JsonSerializer.Serialize(pObj);
await _client.SetPolicyAsync(bucketName, po);
}
} private string CreateNewFileName(string bucketName, string oldFileName)
{
var dt = Guid.NewGuid().ToString().Replace("-", "").Substring(10) + DateTimeOffset.Now.ToUnixTimeSeconds();
var extensions = Path.GetExtension(oldFileName);
var newFileName = $"{bucketName}-{dt}{extensions}";
return newFileName;
}
}

6、注入服务

services.AddSingleton<IMinIOService, MinIOService>();

7、其它需要的类

 public class Result<T>
{
public Result(bool isSuccess,string msg)
{
this.IsSuccess = isSuccess;
this.Msg = msg; }
public bool IsSuccess { get; set; }
public string Code { get; set; }
public string Msg { get; set; }
/// <summary>
/// 返回数据列表
/// </summary>
public Object Data { set; get; }
}
 public class FileModel
{
public string Url { get; set; }
}

8、上传文件的api

[ApiController]
[Route("[controller]")]
public class FileManagerController : Controller
{
public IMinIOService _minIOService { get; set; }
public FileManagerController(IMinIOService minIOService)
{
this._minIOService = minIOService;
}
[Route("UploadImg")]
/// <summary>
/// 上传图片
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task<Result<FileModel>> UploadImg(FormFileCollection file)
{
return await _minIOService.UploadImageAsync(file);
}
}

9、启动swagger,选择要上传的文件上传,测试效果

上传后的文件:

minIO系列文章04---windows下安装及在.netcore使用的更多相关文章

  1. 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  2. redis系列一: windows下安装redis

    一. 下载Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 red ...

  3. RabbitMQ学习系列一:windows下安装RabbitMQ服务

    Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 第一步下载erlang:http://www.erlang.org/download ...

  4. windows下安装RabbitMQ【我】

    windows下 安装 rabbitMQ rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实 ...

  5. [转]RabbitMQ系列(一):Windows下RabbitMQ安装及入门

    https://blog.csdn.net/hzw19920329/article/details/53156015 1.Windows下安装RabbitMQ需要以下几个步骤 (1):下载erlang ...

  6. windows下安装ubuntu15.04

    本文主要介绍windows下安装ubuntu15.04,对与其他的版本也是适用的.现在要讲的是一种最简单ubuntu的安装方式. 1软件下载 1.磁盘分区工具DiskGenius 2.启动项修改工具E ...

  7. Docker学习系列(一):windows下安装docker(转载)

    本文目录如下: windows按照docker的基本要求 具体安装步骤 开始使用 安装远程连接工具连接docker 安装中遇到的问题 Docker的更新 Docker中的jupyter windows ...

  8. RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ

    摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...

  9. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  10. QT学习之windows下安装配置PyQt5

    windows下安装配置PyQt5 目录 为什么要学习QT 命令行安装PyQt5以及PyQt5-tools 配置QtDesigner.PyUIC及PyRcc 为什么要学习QT python下与界面开发 ...

随机推荐

  1. iOS移动应用安全加固:保护您的App免受恶意攻击的重要步骤

    ​ 目录 iOS移动应用安全加固:保护您的App免受恶意攻击的重要步骤 摘要 引言 一.APP加固的概念 二.APP加固方案的比较 三.保护iOS应用的安全 四.总结 参考资料 摘要 本文介绍了移动应 ...

  2. 通过mongo-driver使用说明 GO 包管理机制

    本篇记录通过GO语言操作mongodb,实现的流程包括: 初始化项目工程 容器方式安装mongo 调试运行和编译运行 go使用mongo的代码如下,go操作mongo的SDK是mongo-driver ...

  3. 干掉 Navicat! 一款数据分析师必备的数据库可视化工具

    数据开发,离不开数据库,一款优秀的数据库开发和管理工具可以达到事半功倍的效果.市面上比较流行的数据库管理工具主要有Navicat.DBeaver.SQLyog等等,Navicat是其中的无冕之王,其拳 ...

  4. ABAP 辨析 标准表|排序表|哈希表

    1.文档介绍 本文档将介绍内表的区别和用法,涉及标准表.排序表.哈希表 2.用法与区别 2.1.内表种类 内表顶层为任意表,任意表分为索引表和哈希表,索引表又可分为标准表和排序表,结构如图: 2.2. ...

  5. MB51增强

    一.在MB51报表中新增列 包含文件RM07DOCS_GENERATED的itab结构中,新增字段 在RM07DOCS中的detail_list子例程中添加查询逻辑 在子例程build_fieldca ...

  6. Make、Makefile、Cmake、QMake 的区别

    本博文的简述or解决问题? make makefile cmake qmake都是什么,有什么区别? 查了一下好像是编译用的,既然是编译为什么我们不用g++. javac 来编译呢?我猜答案是方便一点 ...

  7. Java 8 Stream原理解析

    说起 Java 8,我们知道 Java 8 大改动之一就是增加函数式编程,而 Stream API 便是函数编程的主角,Stream API 是一种流式的处理数据风格,也就是将要处理的数据当作流,在管 ...

  8. 【收藏】制作艺术二维码,用 Stable Diffusion 就行!

    [收藏]Stable Diffusion 制作光影文字效果 https://www.cnblogs.com/Serverless/p/17620406.html 基于函数计算FC 快捷部署 Stabl ...

  9. P1185【绿】

    这道题是画图题,画图题当画布总大小较小的时候其实可以先创建一个二维数组,这样就可以实现随意移动"光标"式的画图,然后直接输出处理后的画布即可,只要注意题目要求的数据范围足够小.画布 ...

  10. 公共号码池redis实现方案

    概述 在企业级呼叫模型中,号码资源总是有限的,企业员工在使用有限的号码资源外呼时,就会有号码冲突的问题,如何解决多人共用少量号码的选号问题? 最近有一个新的业务需求,需要解决公共号码池的选号问题,号码 ...