minIO系列文章04---windows下安装及在.netcore使用
一、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使用的更多相关文章
- 一步步实现windows版ijkplayer系列文章之四——windows下编译ijkplyer版ffmpeg
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- redis系列一: windows下安装redis
一. 下载Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 red ...
- RabbitMQ学习系列一:windows下安装RabbitMQ服务
Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 第一步下载erlang:http://www.erlang.org/download ...
- windows下安装RabbitMQ【我】
windows下 安装 rabbitMQ rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实 ...
- [转]RabbitMQ系列(一):Windows下RabbitMQ安装及入门
https://blog.csdn.net/hzw19920329/article/details/53156015 1.Windows下安装RabbitMQ需要以下几个步骤 (1):下载erlang ...
- windows下安装ubuntu15.04
本文主要介绍windows下安装ubuntu15.04,对与其他的版本也是适用的.现在要讲的是一种最简单ubuntu的安装方式. 1软件下载 1.磁盘分区工具DiskGenius 2.启动项修改工具E ...
- Docker学习系列(一):windows下安装docker(转载)
本文目录如下: windows按照docker的基本要求 具体安装步骤 开始使用 安装远程连接工具连接docker 安装中遇到的问题 Docker的更新 Docker中的jupyter windows ...
- RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ
摘要 本篇经验将和大家介绍Windows下安装和部署RabbitMQ消息队列服务器,希望对大家的工作和学习有所帮助! 目录 一.Erlang语言环境的搭建 二.RabbitMQ服务环境的搭建 三.Ra ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- QT学习之windows下安装配置PyQt5
windows下安装配置PyQt5 目录 为什么要学习QT 命令行安装PyQt5以及PyQt5-tools 配置QtDesigner.PyUIC及PyRcc 为什么要学习QT python下与界面开发 ...
随机推荐
- 万字保姆级长文——Linkedin元数据管理平台Datahub离线安装指南
元数据管理平台Datahub最近的热度越来越高.已经更新到了0.8.40的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题. 考虑到有些企业部分数据服务是部署在内网的,那么离线安装D ...
- DataLeap的全链路智能监控报警实践(二):概念介绍
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ...
- CNCF大使预测:2024年云原生面临倦怠、离职及云成本精简
本文由 CNCF 大使 Eric D. Schabell 撰写,预测2024年云原生领域最可能发生的3大变化,并与其对云原生可观测性领域的见解结合. 关注云原生倦怠 毫无疑问,在 2023 年中云原生 ...
- Codeforces Round #716 (Div. 2) A ~ D 个人题解
补题链接:Here 1514A. Perfectly Imperfect Array 题意:给定长度为 \(n\) 的 \(a\) 序列,请问是否存在子序列积不存在平方根 思路:子序列的话,一个元素也 ...
- 在vue项目中使用momentjs获取今日、昨日、本周、本月、上月、本年、上年等日期,时间比较计算
https://blog.csdn.net/qq_15058285/article/details/119925056
- mongoose学习记录
1 const mongoose = require('mongoose'); 2 3 mongoose.connect('mongodb://localhost/playground') 4 .th ...
- KSP(坎巴拉)萌新感悟
1.为什么降落月球等无大气星球时减速为亚轨道之后便不再减速,等到快坠落的时候在满节流阀极限减速最省燃料? 因为我们的dv是确定的,燃料能给我们带来一定量的冲量,却因此可以带来不一定量的动量,显然速度越 ...
- MES系统初探(一)
什么是MES系统 MES系统是制造执行系统(Manufacturing Execution System)的缩写,是一种用于监控.控制和优化制造过程的软件系统.它主要负责协调生产计划.生产调度.生产执 ...
- maven总结二: 常用标签及属性
本文为博主原创,未经允许不得转载 目录: 1. maven 依赖属性:groupId.artifactId.version 2.插件执行: execution,id ,phase,goals,con ...
- 基于python的药店药品信息管理系统-毕业设计-课程设计
基于python+django+vue.js开发的药店信息管理系统 功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发. 功能包括:药品管理.分类 ...