223 lines
6.8 KiB
C#
223 lines
6.8 KiB
C#
using System.IO;
|
||
using System.Windows;
|
||
using System.Windows.Input;
|
||
using HeBianGu.Base.WpfBase;
|
||
using Hopetry.Models;
|
||
using Hopetry.Provider;
|
||
using SqlSugar;
|
||
|
||
namespace Hopetry.Services;
|
||
|
||
[SugarTable(TableName = "download_task")]
|
||
public class MinioDownloadTask : NotifyPropertyChangedBase
|
||
{
|
||
public MinioService Minio;
|
||
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public CancellationTokenSource StopDownTs;
|
||
|
||
/// <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; 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 _downloadInfo;
|
||
|
||
[SugarColumn(IsIgnore = true)]
|
||
public String DownloadInfo
|
||
{
|
||
get => _downloadInfo;
|
||
set
|
||
{
|
||
_downloadInfo = value;
|
||
RaisePropertyChanged();
|
||
}
|
||
}
|
||
|
||
private String _speed;
|
||
|
||
[SugarColumn(IsIgnore = true)]
|
||
public String Speed
|
||
{
|
||
get => _speed;
|
||
set
|
||
{
|
||
_speed = value;
|
||
RaisePropertyChanged();
|
||
}
|
||
}
|
||
|
||
private Double _progress;
|
||
|
||
[SugarColumn(IsIgnore = true)]
|
||
public Double Progress
|
||
{
|
||
get
|
||
{
|
||
if (_progress == 0)
|
||
{
|
||
_progress = Downloaded == 0 ? 0 : (Downloaded * 100 / TotalSize);
|
||
}
|
||
|
||
return _progress;
|
||
}
|
||
set
|
||
{
|
||
_progress = value;
|
||
RaisePropertyChanged();
|
||
}
|
||
}
|
||
|
||
private string _startOrPauseIcon;
|
||
|
||
[SugarColumn(IsIgnore = true)]
|
||
public string StartOrPauseIcon
|
||
{
|
||
get => _startOrPauseIcon;
|
||
set
|
||
{
|
||
_startOrPauseIcon = value;
|
||
RaisePropertyChanged();
|
||
}
|
||
}
|
||
|
||
|
||
public MinioDownloadTask()
|
||
{
|
||
}
|
||
|
||
public MinioDownloadTask(MinioService minio, string bucket, string objectKey, string downDir, string fileSize)
|
||
{
|
||
StartOrPauseIcon = "\xe76e";
|
||
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;
|
||
Speed = Status;
|
||
DownloadInfo = $"0MB/{FileSize}";
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 下载
|
||
/// </summary>
|
||
/// <param name="savePath"></param>
|
||
public async Task StartDownload()
|
||
{
|
||
StopDownTs = 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 = "下载中";
|
||
var humanFileSize = (TotalSize > 1048576
|
||
? $"{TotalSize / 1048576}MB"
|
||
: $"{TotalSize / 1024}KB");
|
||
var offset = Downloaded;
|
||
Console.WriteLine("偏移量:" + (offset > 1048576 ? $"{offset / 1048576:f2}MB" : $"{(offset) / 1024:f2}KB"));
|
||
await Minio.DownLoadObjectWithCallBack(this, Bucket, ObjectKey, FilePath, FileETag,
|
||
(downloaded, total, speed) =>
|
||
{
|
||
var progress = (double)(downloaded + offset) / total * 100;
|
||
Downloaded = downloaded + offset;
|
||
/*using (var client = SqlSugarConfig.GetSqlSugarScope())
|
||
{
|
||
updateTask.Downloaded = downloaded;
|
||
client.Updateable(updateTask).IgnoreNullColumns().ExecuteCommandAsync();
|
||
}*/
|
||
Application.Current.Dispatcher.Invoke(() =>
|
||
{
|
||
var remaining = total - downloaded;
|
||
var seconds = speed > 0 ? remaining / speed : 0;
|
||
Speed = (speed > 1048576
|
||
? $"{speed / 1048576:f2}MB/s"
|
||
: $"{speed / 1024:f2}KB/s") + $" 剩余时间 {TimeSpan.FromSeconds(seconds):mm\\:ss}";
|
||
Progress = progress;
|
||
DownloadInfo = (downloaded + offset > 1048576
|
||
? $"{(downloaded + offset) / 1048576:f2}MB"
|
||
: $"{(downloaded + offset) / 1024:f2}KB") + "/" + humanFileSize;
|
||
//Console.WriteLine($"{DownloadInfo}");
|
||
/*var x =
|
||
$"{(double)downloaded / total:P1} | {speed:0.0} KB/s | 剩余 {TimeSpan.FromSeconds(seconds):mm\\:ss}";
|
||
Console.WriteLine(x);*/
|
||
});
|
||
}, offset: offset);
|
||
Status = "已完成";
|
||
updateTask.Status = Status;
|
||
updateTask.Downloaded = TotalSize;
|
||
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}下载完成");
|
||
}
|
||
finally
|
||
{
|
||
_pauseEvent.Dispose();
|
||
RaisePropertyChanged(nameof(Status));
|
||
}
|
||
}
|
||
} |