using Minio;
using Minio.DataModel;
using NLog;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WpfImges
{
/// <summary>
/// Minio 帮助类
/// </summary>
public class MinioHelper : IDisposable
{
private static readonly Logger Log = LogManager.GetLogger("MinioHelper");
private static MinioClient _minioClient;
/// <summary>
/// 初始化赋值
/// </summary>
/// <param name="endpoint">#Minio地址</param>
/// <param name="accessKey">Minio账号</param>
/// <param name="secretKey">Minio密码</param>
public MinioHelper(string endpoint, string accessKey, string secretKey)
{
_minioClient = new MinioClient(endpoint, accessKey, secretKey);
}
/// <summary>
/// 判断桶存不存在
/// </summary>
/// <param name="_bucketName">创建的桶名称</param>
/// <returns></returns>
public async Task<bool> BucketExistsAsync(string _bucketName)
{
try
{
return await _minioClient.BucketExistsAsync(_bucketName);
}
catch (Exception ex)
{
Log.Error(ex.Message);
return false;
}
}
/// <summary>
/// 创建Bucket桶
/// </summary>
/// <param name="_bucketName">创建的桶名称</param>
/// <returns></returns>
public async Task<bool> MakeBucketAsync(string _bucketName)
{
try
{
await _minioClient.MakeBucketAsync(_bucketName);
return true;
}
catch (Exception ex)
{
Log.Error(ex.Message);
return false;
}
}
/// <summary>
/// 获取已存在的Buckets
/// </summary>
/// <returns></returns>
public async Task<ListAllMyBucketsResult> ListBucketsAsync()
{
try
{
return await _minioClient.ListBucketsAsync();
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
/// <summary>
/// 删除桶
/// </summary>
/// <param name="_bucketName">创建的桶名称</param>
/// <returns></returns>
public async Task RemoveBucketAsync(string _bucketName)
{
try
{
await _minioClient.RemoveBucketAsync(_bucketName);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
}
/// <summary>
/// 列出存储桶中的所有对象。`
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="_prefix">前缀字符串。列出名称以开头的对象prefix</param>
/// <param name="_recursive">如果为false,则模拟目录结构,其中返回的每个列表都是完整对象或对象键的一部分,直到第一个“ /”。所有具有相同前缀(直到第一个“ /”)的对象都将合并到一个条目中。默认为false</param>
/// <returns></returns>
public async Task<IObservable<Item>> ListObjectsAsync(string _bucketName, string _prefix = null, bool _recursive = true)
{
try
{
return await Task.Run(() => _minioClient.ListObjectsAsync(_bucketName, _prefix, _recursive));
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
/// <summary>
/// 将对象下载为流。
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="_objectName">存储桶中的对象名称</param>
/// <returns></returns>
public async Task<Stream> GetObjectAsync(string _bucketName, string _objectName)
{
Stream _outStream = null;
try
{
await _minioClient.StatObjectAsync(_bucketName, _objectName);
await _minioClient.GetObjectAsync(_bucketName, _objectName, (stream) =>
{
_outStream = stream;
});
return _outStream;
}
catch (Exception ex)
{
Log.Error(ex.Message);
return _outStream;
}
}
/// <summary>
/// 将对象下载并保存为本地文件系统中的文件
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="_objectName">存储桶中的对象名称</param>
/// <param name="_savepath">保存路径</param>
/// <returns></returns>
public async Task GetObjectAsync(string _bucketName, string _objectName, string _savepath)
{
try
{
await _minioClient.StatObjectAsync(_bucketName, _objectName);
await _minioClient.GetObjectAsync(_bucketName, _objectName, _savepath + "/" + _objectName);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
}
/// <summary>
/// 将内容从流上传到objectName。
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="objectName">存储桶中的对象名称</param>
/// <param name="filepath">文件路径+文件全名称</param>
/// <param name="contentType">文件的内容类型。默认为“应用程序/八位字节流”</param>
public async Task PutObjectByStreamAsync(string _bucketName, string _objectName, string _filepath, string _contentType)
{
try
{
byte[] bs = File.ReadAllBytes(_filepath);
MemoryStream filestream = new MemoryStream(bs);
Aes aesEncryption = Aes.Create();
aesEncryption.KeySize = 256;
aesEncryption.GenerateKey();
var ssec = new SSEC(aesEncryption.Key);
await _minioClient.PutObjectAsync(_bucketName, _objectName, filestream, filestream.Length, _contentType, null, ssec);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
}
/// <summary>
/// 将内容从文件上传到objectName
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="objectName">存储桶中的对象名称</param>
/// <param name="filepath">文件路径+文件全名称</param>
/// <param name="contentType">文件的内容类型。默认为“应用程序/八位字节流”</param>
public async Task PutObjectByFileAsync(string _bucketName, string _objectName, string _filepath, string _contentType)
{
try
{
await _minioClient.PutObjectAsync(_bucketName, _objectName, _filepath, _contentType);
}
catch (Exception ex)
{
Log.Error(ex.Message);
}
}
/// <summary>
/// 获取对象的元数据
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="_objectName">存储桶中的对象名称</param>
/// <returns></returns>
public async Task<ObjectStat> StatObjectAsync(string _bucketName, string _objectName)
{
try
{
return await _minioClient.StatObjectAsync(_bucketName, _objectName);
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
/// <summary>
/// 为HTTP GET操作生成一个预签名的URL。即使存储桶是私有的,浏览器/移动客户端也可能指向该URL直接下载对象。该预签名URL可以具有关联的到期时间(以秒为单位),在此时间之后,它将不再起作用。默认有效期设置为7天
/// </summary>
/// <param name="_bucketName">桶名</param>
/// <param name="_objectName">存储桶中的对象名称</param>
/// <param name="_expiresInt">到期秒数。默认有效期设置为7天</param>
/// <returns></returns>
public async Task<string> PresignedGetObjectAsync(string _bucketName, string _objectName, int _expiresInt)
{
try
{
return await _minioClient.PresignedGetObjectAsync(_bucketName, _objectName, _expiresInt);
}
catch (Exception ex)
{
Log.Error(ex.Message);
return null;
}
}
public void Dispose()
{
}
}
}
使用nuget 下载minio和nlog
windows如何使用minio
下载minio.exe
新建run.bat文件,内容如下:
set MINIO_ACCESS_KEY=admin
set MINIO_SECRET_KEY=12345678
minio.exe server D:\minioData
D:\minioData是minio储存目录
运行bat