一、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. 资源成本降低60%!火山引擎ByteHouse助力数字营销平台仟传网络降本增效

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   近日,中国知名内容社交平台整合营销企业仟传网络与火山引擎ByteHouse达成合作.仟传网络将通过火山引擎By ...

  2. A/B测试助力游戏业务增长

    更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 中国游戏行业发展现状及挑战 国内市场增长乏力 2021年游戏销售收入2965.13亿元,同比增长6.4% ...

  3. 大银行数字化升级之后,火山引擎 VeDI 这次要把能力带给中小金融机构

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 数据技术是金融行业数字化转型的重要动力. 近年来,各大银行在全面推进数据技术建设上动作频频.比如,建设银行深化平台经营,依 ...

  4. Html 表格 在线转 Markdown

    复制 HTML Table F12 查看网页源代码 Html to markdown 在线转换 https://tableconvert.com/html-to-markdown 复制 Markdow ...

  5. SpringBoot WebService 及 注意项

    SpringBoot WebService 源代码:https://gitee.com/VipSoft/VipWebService SpringBoot 版本 <version>2.3.0 ...

  6. MySQL Select 语句执行顺序

    一条 SQL 查询语句结构如下: SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN ...

  7. 本地安装mysql (zip)

    下载 https://downloads.mysql.com/archives/community/ 解压到文件夹且添加系统环境变量 C:\Dinstall\Dmysql\mysql-8.2.0-wi ...

  8. 🤗Hugging Face 87个 AI 游戏可以在线玩啦

    7月9日结束的开源游戏挑战赛有超过来自全球 1000 多名开发者参加 一共收录了 87 个游戏 目前已经进入投票期 视频中的:猜名画 ️ 用了之前推荐的 LEDITS 目前得分很高呢 来试试看你能猜对 ...

  9. 【django-Vue】项目day01 pip永久换源 虚拟环境搭建 项目前后端创建 项目目录调整

    目录 昨日回顾 1 企业项目类型 2 企业项目开发流程 3 路飞项目需求 4 pip永久换源 5 虚拟环境搭建 5.1 使用pycharm创建虚拟环境 5.2 通用方案创建虚拟环境 6 luffy项目 ...

  10. 当谈论 React hook,我们究竟说的是什么?

    这个标题很大,但是落点很小,只是我,一个开发者在学习和使用 hooks 中的一点感受和总结. React hook 的由来 React hook 的由来,其实也可以看作是前端技术不断演进的结果. 在 ...