You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
4.7 KiB
C#

1 year ago
using Minio;
using Minio.DataModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection.Emit;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Net.WebRequestMethods;
namespace test2
{
class MinioFileManager
{
private static string endpoint = "10.40.18.12:9000";
private static string accessKey = "root";
private static string secretKey = "root_password";
private static string bucketName = "hbl";
private static string url = $"http://{endpoint}/hbl";
private static MinioClient minioClient=new MinioClient().WithEndpoint(endpoint)
.WithCredentials(accessKey, secretKey)
.Build();
// Initialize the client with access credentials.
private static string getObjectNameByUrl(String input) {
if (input.StartsWith(url))
{
string desiredContent = input.Substring(url.Length);
return desiredContent;
}
else
{
return input;
}
}
public static async Task<String> UploadFileAsync(string filePath,string objectName=null)
{
if (!await minioClient.BucketExistsAsync(new BucketExistsArgs()
.WithBucket(bucketName)))
{
await minioClient.MakeBucketAsync(new MakeBucketArgs()
.WithBucket(bucketName));
}
if (objectName == null) objectName = System.IO.Path.GetFileName(filePath);
objectName = $"{DateTime.Now.ToString("yyyy-MM-dd")}/{objectName}";
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath);
await minioClient.PutObjectAsync(putObjectArgs);
return $"{url}/{objectName}";
}
public static async Task DeleteFileAsync(string inputUrl)
{
await minioClient.RemoveObjectAsync(new RemoveObjectArgs()
.WithBucket(bucketName).WithObject(getObjectNameByUrl(inputUrl)));
}
/// <summary>列出存储桶里的对象
/// 列出存储桶里的对象
/// </summary>
/// <param name="minio">连接实例</param>
/// <param name="bucketName">存储桶名称</param>
/// <param name="prefix">对象的前缀</param>
/// <param name="recursive">true代表递归查找false代表类似文件夹查找以'/'分隔,不查子文件夹</param>
public static IObservable<Item> ListObjects(Action<Item> action,string prefix = null, bool recursive = true)
{
try
{
ListObjectsArgs args = new ListObjectsArgs()
.WithBucket(bucketName)
.WithPrefix(prefix)
.WithRecursive(recursive);
IObservable<Item> observable = minioClient.ListObjectsAsync(args);
var subscription = observable.Subscribe(new MyObserver(action));
return observable;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
class MyObserver : IObserver<Item>
{
private Action<Item> action;
public MyObserver(Action<Item> action) {
this.action = action;
}
public void OnCompleted()
{
Console.WriteLine("Completed");
}
public void OnError(Exception error)
{
Console.WriteLine("Error: " + error.Message);
}
public void OnNext(Item value)
{
action(value);
Console.WriteLine("Next: " + value.Key);
}
}
public static async Task DownloadFileAsync(string objectName)
{
var saveFileDialog = new SaveFileDialog();
string fileExtension = Path.GetExtension(objectName);
saveFileDialog.FileName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}"+ fileExtension;
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
saveFileDialog.Filter = "All Files (*.*)|*.*";
var stat = await minioClient.GetObjectAsync(new GetObjectArgs()
.WithBucket(bucketName)
.WithObject(getObjectNameByUrl(objectName))
.WithFile(saveFileDialog.FileName));
MessageBox.Show("下载成功");
}
}
}
}