FieldWorkClient/Services/MinioDownloadTask.cs

223 lines
6.8 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.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));
}
}
}