155 lines
3.9 KiB
C#
155 lines
3.9 KiB
C#
|
|
using System.Windows;
|
|||
|
|
using System.Windows.Input;
|
|||
|
|
using HeBianGu.Base.WpfBase;
|
|||
|
|
using Hopetry.Models;
|
|||
|
|
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")] 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; private set; } = "等待中";
|
|||
|
|
|
|||
|
|
public string Progress
|
|||
|
|
{
|
|||
|
|
get { return TotalSize == 0 ? "0%" : $"{(Downloaded * 100 / TotalSize):0.0}%"; }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 命令
|
|||
|
|
public ICommand PauseCommand { get; }
|
|||
|
|
public ICommand CancelCommand { get; }
|
|||
|
|
|
|||
|
|
public MinioDownloadTask()
|
|||
|
|
{
|
|||
|
|
PauseCommand = new CustomCommand(OnPause);
|
|||
|
|
CancelCommand = new CustomCommand(OnCancel);
|
|||
|
|
}
|
|||
|
|
public MinioDownloadTask(MinioService minio, string bucket, string objectKey)
|
|||
|
|
{
|
|||
|
|
_minio = minio;
|
|||
|
|
Bucket = bucket;
|
|||
|
|
ObjectKey = objectKey;
|
|||
|
|
TaskId = Interlocked.Increment(ref _globalId);
|
|||
|
|
FileName = Path.GetFileName(objectKey);
|
|||
|
|
|
|||
|
|
PauseCommand = new CustomCommand(OnPause);
|
|||
|
|
CancelCommand = new CustomCommand(OnCancel);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 下载
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="savePath"></param>
|
|||
|
|
public async Task StartDownload(string savePath)
|
|||
|
|
{
|
|||
|
|
Status = "初始化";
|
|||
|
|
_cts = new CancellationTokenSource();
|
|||
|
|
var tmpPath = $"{savePath}.download";
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 断点续传初始化
|
|||
|
|
if (File.Exists(tmpPath))
|
|||
|
|
Downloaded = new FileInfo(tmpPath).Length;
|
|||
|
|
|
|||
|
|
// 获取文件信息
|
|||
|
|
var stat = await _minio.GetObjectMetadata(Bucket, ObjectKey);
|
|||
|
|
TotalSize = stat.Size;
|
|||
|
|
|
|||
|
|
if (Downloaded >= TotalSize)
|
|||
|
|
{
|
|||
|
|
Status = "已完成";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// todo 下载逻辑
|
|||
|
|
Status = "已完成";
|
|||
|
|
}
|
|||
|
|
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));
|
|||
|
|
|
|||
|
|
private static int _globalId;
|
|||
|
|
}
|