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

308 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.IO;
using Newtonsoft.Json;
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using S3Demo.Model;
using S3Demo.Model.Uploader;
using Ksat.Supplyment.Library.Model;
using Ksat.Supplyment.Library.Uploader;
using Ksat.Supplyment.Library.Model.Uploader;
using System.Threading.Tasks;
using System.Threading;
namespace S3Demo
{
public class Run
{
//private static string url = "http://172.17.204.180:9000/api/tri/trackin";
private static BasicAWSCredentials credentials = new BasicAWSCredentials("admin", "admin123.");
//private static BasicAWSCredentials credentials = new BasicAWSCredentials("Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
private static string bucketName = "minio/test";
// 受监控的目录,完整目录如:"D:\ClientDir\line01\AOI\20211129\133055851SN001.png"
private static string[] paths = { @"D:\ClientDir" };
private static string suffix = "*.png";
/// <summary>
/// https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/S3/TS3Config.html
/// https://blog.csdn.net/tw_tangliang/article/details/118669099
/// https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/dotnetv3/S3/UploadFileMPUHighLevelAPIExample/UploadFileMPUHighLevelAPIExample/UploadFileMPUHighLevelAPI.cs
/// </summary>
// 通过IP + Port方式
private static AmazonS3Config conf = new AmazonS3Config()
{
UseHttp = true,
ProxyHost = "http://192.168.60.132",
ProxyPort = 9000,
RegionEndpoint = RegionEndpoint.USEast1
};
// 通过固定域名的方式
//private static AmazonS3Config conf = new AmazonS3Config()
//{
// ServiceURL = "https://play.min.io",
// ForcePathStyle = true
//};
public static AmazonS3Client client = new AmazonS3Client(credentials, conf);
public static void Main()
{
try
{
#region 目录监控
foreach (var path in paths)
{
FileSystemWatcher watch = new FileSystemWatcher()
{
Path = path,
Filter = suffix,
IncludeSubdirectories = true,
NotifyFilter = NotifyFilters.LastAccess
| NotifyFilters.LastWrite
| NotifyFilters.FileName
| NotifyFilters.DirectoryName,
};
watch.Created += OnCreated;
watch.Error += OnError;
// 开始监控
watch.EnableRaisingEvents = true;
}
#endregion
#region 保存至数据库
//string s3Flag = ObjectModel.Putobjectswithtags(bucketName, S3Path, e.FullPath, tags, credentials, conf).Result;
//if (s3Flag.Equals("OK"))
//{
//保存至数据库
//using (var dev = new CodeFirstDbContext())
// {
// dev.UploadFinishs.Add(new UploadFinish()
// {
// UploaderID = lineName,
// Tag = sn,
// CreateAt = dt_fomat,
// RetryAt = DateTime.ParseExact(now, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.CurrentCulture),
// RetryCount = 1,
// RequestData = S3Path
// });
// int dbFlag = dev.SaveChanges();//1: 保存至数据库成功,否则保存失败
// //TODO: 请求接口
// //ReqData req = new ReqData();
// //RespData resp = new RespData();
// //req.s3Flag = s3Flag;
// //req.dbFlag = dbFlag;
// //resp = JsonConvert.DeserializeObject<RespData>(HttpModel.PostUrl(url, JsonConvert.SerializeObject(req)));
// //Console.WriteLine("resp: " + resp.code + " " + resp.message);
// }
//Console.WriteLine("S3对象存储路径: " + bucketName + "/" + S3Path);
//}
//else
//{
// Console.WriteLine("上传未完成");
//}
//Uploader<string> uploader = new Uploader<string>("字符串测试", new UploaderOperator());
//for (var i = 0; i < 5; i++)
//{
// uploader.AddUploadRequest($"hello{i}", $"tag{i}");
//}
#endregion
#region S3相关测试
/*
//creating Bucket
//await CreateBucket.CreatingBucket("minio/bu29", credentials, conf);
//upload Dir
string dirPath = @"C:\Users\song\Pictures\Saved Pictures\";
string suffix = "*.png";
//await UploadDirMPUHighLevelAPI.Uploaderdir(bucketName, dirPath, suffix, credentials, conf);
//upload File
string keyName = "logo.png";
//await UploadFileMPUHighLevelAPI.Uploaderfile(bucketName, keyName, dirPath, credentials, conf);
//list Objects
//await ListObjects.Listingobjects(bucketName, credentials, conf);
//upload Object With Tag
string filaPath = @"C:\Users\song\Pictures\Saved Pictures\" + keyName;
String[] tags = new String[] { "SN123456", DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:sszzz"), "AB023" };
//await ObjectModel.Putobjectswithtags(bucketName, keyName, filaPath, tags, credentials, conf);
//read Object
//await ObjectModel.Readobjectdata(bucketName, keyName, credentials, conf);
//isExist Bucket
//从"minio/test"中取出存储桶名
var _bucketName = bucketName.Split('/')[1];
//此处传入bucketName: "test"
//var flag = await BucketModel.isExistBucket(_bucketName, credentials, conf);
//if (flag)
//{
// Console.WriteLine("exist");
//}
//else
//{
// Console.WriteLine("not exist");
// //docker创建buckeyt时此处传入BucketName: "minio/test"
// //play.min.io创建buckeyt时传入BucketName: "test"
// await BucketModel.CreateBucket(bucketName, credentials, conf);
//}
////删除桶docker删除桶"minio/test"; play.min.io删除桶"test"
//await new AmazonS3Client(credentials, conf).DeleteBucketAsync(bucketName);
//Console.WriteLine("delete bucket " + bucketName);
*/
#endregion
}
catch (Exception ex)
{
Console.WriteLine($"Main: {ex.Message}");
}
Console.ReadKey();
}
#region 上传测试
public class UploaderOperator : IUploaderOperator<string>
{
public string ConvertCacheToRequest(string cache)
{
return cache;
}
public string ConvertRequestToCachel(string requestData)
{
return requestData;
}
public bool ShouldRetryRequest(UploadModel<string> requestModel, out string cancelReason)
{
cancelReason = null;
if (requestModel.RetryCount >= 2)
{
cancelReason = "已经两次fail了";
return false;
}
return true;
}
public bool ShouldStartRequest(UploadModel<string> requestModel, out string cancelReason)
{
cancelReason = null;
return true;
}
public IUploaderRequest<string> UploadData(string data)
{
var request = new UploadRequest();
request.RequestData = data;
return request;
}
}
public class UploadRequest : IUploaderRequest<string>
{
private string mRequestData;
public string RequestData { get => mRequestData; set => mRequestData = value; }
public event UploadFinishHandler UploadFinish;
public void Start()
{
Console.WriteLine($"{DateTime.UtcNow.ToString("mm:ss.fff")} task {RequestData} Started");
System.Threading.Thread.Sleep(100);
var random = new Random();
UploadFinish(this, random.Next() % 2 == 0, "task failed");
}
public void Cancel()
{
}
}
#endregion
/// <summary>
/// 创建文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static async void OnCreated(object sender, FileSystemEventArgs e)
{
Waiting(e.FullPath);
await DisposeFile(e.FullPath);
}
/// <summary>
/// 等待onCreated事件处理完成
/// </summary>
/// <param name="path">被创建的文件路径</param>
private static void Waiting(string path)
{
try
{
FileInfo fi;
fi = new FileInfo(path);
long len1, len2;
len2 = fi.Length;
do
{
len1 = len2;
Thread.Sleep(1000);//等待1秒钟
fi.Refresh();//这个语句不能漏了
len2 = fi.Length;
} while (len1 < len2);
}
catch { }
}
/// <summary>
/// 处理文件
/// </summary>
/// <param name="path">文件路径</param>
/// <returns></returns>
private static async Task DisposeFile(string path)
{
// D:\ClientDir\line01\AOI\20211129\085023891P107CN14T00001.png
string lineName = Path.GetDirectoryName(path).Split('\\')[2];
string equipmentName = Path.GetDirectoryName(path).Split('\\')[3];
string date = Path.GetDirectoryName(path).Split('\\')[4];
string fileName = Path.GetFileName(path);
string datetime = date + fileName.Substring(0, 9);
string dt_fomat = DateTime.ParseExact(datetime, "yyyyMMddHHmmssfff", System.Globalization.CultureInfo.CurrentCulture).ToString("yyyy-MM-dd HH:mm:ss:fff");
string sn = fileName.Substring(9, 14);
string now = DateTime.Now.ToString("yyyyMMddHHmmssfff");
String[] tags = new String[] { sn, dt_fomat };
string S3Path = lineName + "/" + equipmentName + "/" + date + "/" + fileName;
string recv = await ObjectModel.PutObjectsWithTagsAsync(client, bucketName, S3Path, path, tags);
Console.WriteLine("recv from S3: " + recv);
//引入统一上传方式
//new S3Uploader(lineName).AddUploadTask(S3Path, sn);
}
/// <summary>
/// 出现错误
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void OnError(object sender, ErrorEventArgs e) =>
PrintException(e.GetException());
/// <summary>
/// 打印错误
/// </summary>
/// <param name="ex"></param>
private static void PrintException(Exception ex)
{
if (ex != null)
{
Console.WriteLine($"Message: {ex.Message}");
Console.WriteLine("Stacktrace:");
Console.WriteLine(ex.StackTrace);
Console.WriteLine();
PrintException(ex.InnerException);
}
}
}
}