FieldWorkClient/Services/MinioDownloadTask.cs

215 lines
6.3 KiB
C#
Raw Blame History

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.Configuration;
using System.Windows;
using System.Windows.Forms.VisualStyles;
using System.Windows.Input;
using HeBianGu.Base.WpfBase;
using Hopetry.Models;
using Hopetry.Provider;
using SqlSugar;
namespace Hopetry.Services;
using System;
using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.ComponentModel;
using Minio;
[SugarTable(TableName = "download_task")]
public class MinioDownloadTask : INotifyPropertyChanged
{
private readonly MinioService _minio;
/// <summary>
///
/// </summary>
private CancellationTokenSource _cts;
/// <summary>
///
/// </summary>
private ManualResetEventSlim _pauseEvent = new(true);
// 任务属性绑定到UI
[SugarColumn(ColumnName = "task_id", IsPrimaryKey = true, IsIdentity = true)]
public int TaskId { get; set; }
[SugarColumn(ColumnName = "file_name")]
public string FileName { get; set; }
[SugarColumn(ColumnName = "bucket_name")]
public string Bucket { get; set; }
[SugarColumn(ColumnName = "object_key")]
public string ObjectKey { get; set; }
[SugarColumn(ColumnName = "total_size")]
public long TotalSize { get; private set; }
[SugarColumn(ColumnName = "downloaded")]
public long Downloaded { get; private set; }
[SugarColumn(ColumnName = "file_path")]
public string FilePath { get; set; }
[SugarColumn(ColumnName = "status")] public string Status { get; set; } = "等待中";
[SugarColumn(ColumnName = "create_time")]
public string CreateTime { get; set; }
[SugarColumn(ColumnName = "finished_time")]
public string FinishedTime { get; set; }
[SugarColumn(ColumnName = "file_size")]
public string FileSize { get; set; }
[SugarColumn(ColumnName = "file_etag")]
public string FileETag { get; set; }
private string _progress;
[SugarColumn(IsIgnore = true)]
public string Progress
{
get
{
if (string.IsNullOrEmpty(_progress))
{
_progress = TotalSize == 0 ? "0%" : $"{(Downloaded * 100 / TotalSize):0.0}%";
}
return _progress;
}
set
{
_progress = value;
OnPropertyChanged(nameof(Progress));
}
}
[SugarColumn(IsIgnore = true)] public ICommand PauseCommand { get; }
[SugarColumn(IsIgnore = true)] public ICommand CancelCommand { get; }
public MinioDownloadTask()
{
PauseCommand = new CustomCommand(OnPause);
CancelCommand = new CustomCommand(OnCancel);
}
public MinioDownloadTask(MinioService minio, string bucket, string objectKey, string downDir, string fileSize)
{
Status = "等待中";
_minio = minio;
Bucket = bucket;
ObjectKey = objectKey;
FileName = Path.GetFileName(objectKey);
FilePath = downDir;
CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//var x = _minio.GetObjectMetadata(bucket, objectKey);
//TotalSize = x.Result.Size;
FileSize = fileSize;
PauseCommand = new CustomCommand(OnPause);
CancelCommand = new CustomCommand(OnCancel);
}
/// <summary>
/// 下载
/// </summary>
/// <param name="savePath"></param>
public async Task StartDownload()
{
_cts = new CancellationTokenSource();
try
{
var stat = await _minio.GetObjectMetadata(Bucket, ObjectKey);
// 获取对象信息
TotalSize = stat.Size;
FileETag = stat.ETag;
Status = "下载中";
var updateTask = new MinioDownloadTask
{
TaskId = TaskId,
Status = Status,
TotalSize = TotalSize,
FileETag = FileETag
};
using (var client = SqlSugarConfig.GetSqlSugarScope())
{
await client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
}
Console.WriteLine($"id {TaskId} path: {FilePath} key: {ObjectKey}文件下载中...");
updateTask.Status = "下载中";
await _minio.DownLoadObjectWithCallBack(Bucket, ObjectKey, FilePath, FileETag,
(downloaded, total) =>
{
var progress = (double)downloaded / total * 100;
Downloaded = downloaded;
using (var client = SqlSugarConfig.GetSqlSugarScope())
{
updateTask.Downloaded = downloaded;
client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
}
Progress = $"{progress:f2}%";
Console.WriteLine($"文件 {FileName} 进度 {Progress}");
});
//await _minio.DownLoadObject(Bucket, ObjectKey, FilePath, "");
Status = "已完成";
updateTask.Status = Status;
updateTask.FinishedTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
using (var client = SqlSugarConfig.GetSqlSugarScope())
{
await client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
}
Console.WriteLine($"文件{ObjectKey}下载完成");
}
catch (OperationCanceledException)
{
Status = "已取消";
}
catch (Exception ex)
{
Status = $"错误:{ex.Message}";
}
finally
{
_pauseEvent.Dispose();
OnPropertyChanged(nameof(Status));
}
}
private void OnPause()
{
if (Status == "下载中")
{
_pauseEvent.Reset();
Status = "已暂停";
}
else if (Status == "已暂停")
{
_pauseEvent.Set();
Status = "下载中";
}
OnPropertyChanged(nameof(Status));
}
private void OnCancel()
{
_cts?.Cancel();
Status = "已取消";
OnPropertyChanged(nameof(Status));
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}