0ad74d9f7f
* feat(Upload/Common): 重构上传功能以添加通用设置管理 - 新增UploadSettings类用于管理上传通用设置 - 重构上传逻辑,将延迟上传功能移至UploadHelper - 在Dlass设置窗口添加通用设置标签页 - 支持多上传提供者管理及取消操作 - 增强文件上传前的验证和错误处理 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * feat(upload): 添加WebDav文件上传支持 - 新增WebDavUploader工具类实现文件上传功能 - 添加WebDavUploadProvider作为上传提供者 - 在设置界面增加WebDav配置选项 - 添加WebDav.Client NuGet包依赖 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * feat(WebDAV): 实现WebDAV上传队列管理 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * feat(Upload): 重命名Dlass设置项为云存储以支持WebDav保存 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * feat(Dlass):迁移Dlass注册位置 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * refactor(Upload): 优化上传逻辑和界面交互 - 修改Dlass标签页检测逻辑,使用Tag属性替代Header - 限制WebDav上传队列的批量处理大小 - 移除多处上传延迟逻辑,统一在通用设置中配置 - 更新Dlass设置界面提示文本 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * chore:修改窗口命名 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * refactor(upload): 重构上传队列为统一管理架构 重构上传队列系统,引入BaseUploadQueue基类实现通用队列管理逻辑,创建UploadQueueHelper统一管理所有上传队列。将DlassUploadQueue和WebDavUploadQueue重构为继承自BaseUploadQueue的具体实现,简化代码并提高可维护性。修改MainWindow初始化代码以使用新的统一初始化方法。 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * refactor(Upload): 重构上传队列系统,改进错误处理和资源管理 - 将上传队列改为可释放资源,实现IDisposable接口 - 移除硬编码的文件验证逻辑,改为可重写方法 - 改进API客户端,支持取消操作和更好的资源管理 - 优化队列初始化流程,增加错误处理 - 统一上传提供者的队列注册方式 - 改进日志记录和错误信息 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * Update Settings.cs * refactor(UpLoad/Queue): 移除冗余的上传成功/失败日志记录 优化WebDav上传逻辑,增加目录创建重试机制 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> * refactor(MW_Settings): 重构全选复选框状态更新逻辑 将直接设置全选复选框状态的逻辑拆分为两步,先计算所有分类复选框状态,再更新全选复选框,提高代码可读性 Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> --------- Signed-off-by: doudou0720 <98651603+doudou0720@users.noreply.github.com> Co-authored-by: CJK_mkp <113243675+CJKmkp@users.noreply.github.com>
270 lines
8.2 KiB
C#
270 lines
8.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
|
|
namespace Ink_Canvas.Helpers
|
|
{
|
|
/// <summary>
|
|
/// 上传提供者接口
|
|
/// </summary>
|
|
public interface IUploadProvider
|
|
{
|
|
/// <summary>
|
|
/// 提供者名称
|
|
/// </summary>
|
|
string Name { get; }
|
|
|
|
/// <summary>
|
|
/// 是否启用
|
|
/// </summary>
|
|
bool IsEnabled { get; }
|
|
|
|
/// <summary>
|
|
/// 上传文件
|
|
/// </summary>
|
|
/// <param name="filePath">文件路径</param>
|
|
/// <param name="cancellationToken">取消令牌</param>
|
|
/// <returns>是否上传成功</returns>
|
|
Task<bool> UploadAsync(string filePath, CancellationToken cancellationToken = default);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Dlass上传提供者
|
|
/// </summary>
|
|
public class DlassUploadProvider : IUploadProvider
|
|
{
|
|
public static readonly DlassUploadQueue Queue = new DlassUploadQueue();
|
|
|
|
/// <summary>
|
|
/// 提供者名称
|
|
/// </summary>
|
|
public string Name => "Dlass";
|
|
|
|
/// <summary>
|
|
/// 是否启用
|
|
/// </summary>
|
|
public bool IsEnabled => MainWindow.Settings?.Upload?.EnabledProviders?.Contains(Name) ?? false;
|
|
|
|
/// <summary>
|
|
/// 上传文件
|
|
/// </summary>
|
|
/// <param name="filePath">文件路径</param>
|
|
/// <param name="cancellationToken">取消令牌</param>
|
|
/// <returns>是否上传成功</returns>
|
|
public async Task<bool> UploadAsync(string filePath, CancellationToken cancellationToken = default)
|
|
{
|
|
return await Queue.UploadFileAsync(filePath, cancellationToken).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// WebDav上传提供者
|
|
/// </summary>
|
|
public class WebDavUploadProvider : IUploadProvider
|
|
{
|
|
public static readonly WebDavUploadQueue Queue = new WebDavUploadQueue();
|
|
|
|
/// <summary>
|
|
/// 提供者名称
|
|
/// </summary>
|
|
public string Name => "WebDav";
|
|
|
|
/// <summary>
|
|
/// 是否启用
|
|
/// </summary>
|
|
public bool IsEnabled => MainWindow.Settings?.Upload?.EnabledProviders?.Contains(Name) ?? false;
|
|
|
|
/// <summary>
|
|
/// 上传文件
|
|
/// </summary>
|
|
/// <param name="filePath">文件路径</param>
|
|
/// <param name="cancellationToken">取消令牌</param>
|
|
/// <returns>是否上传成功</returns>
|
|
public async Task<bool> UploadAsync(string filePath, CancellationToken cancellationToken = default)
|
|
{
|
|
return await Queue.UploadFileAsync(filePath, cancellationToken).ConfigureAwait(false);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 上传帮助类
|
|
/// </summary>
|
|
public static class UploadHelper
|
|
{
|
|
private static readonly List<IUploadProvider> _providers = new List<IUploadProvider>();
|
|
private static bool _initialized;
|
|
private static readonly object s_sync = new object();
|
|
|
|
/// <summary>
|
|
/// 初始化上传帮助类
|
|
/// </summary>
|
|
public static void Initialize()
|
|
{
|
|
lock (s_sync)
|
|
{
|
|
if (_initialized)
|
|
return;
|
|
|
|
// 注册默认上传提供者
|
|
RegisterProviderInternal(new DlassUploadProvider());
|
|
RegisterProviderInternal(new WebDavUploadProvider());
|
|
|
|
// 注册上传队列
|
|
UploadQueueHelper.RegisterQueue(DlassUploadProvider.Queue);
|
|
UploadQueueHelper.RegisterQueue(WebDavUploadProvider.Queue);
|
|
|
|
// 初始化所有上传队列
|
|
UploadQueueHelper.InitializeAllQueues();
|
|
|
|
_initialized = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册上传提供者
|
|
/// </summary>
|
|
/// <param name="provider">上传提供者</param>
|
|
public static void RegisterProvider(IUploadProvider provider)
|
|
{
|
|
if (provider == null)
|
|
return;
|
|
|
|
lock (s_sync)
|
|
{
|
|
RegisterProviderInternal(provider);
|
|
}
|
|
}
|
|
|
|
private static void RegisterProviderInternal(IUploadProvider provider)
|
|
{
|
|
if (provider != null)
|
|
{
|
|
bool providerExists = _providers.Any(p => p.GetType() == provider.GetType());
|
|
if (!providerExists)
|
|
{
|
|
_providers.Add(provider);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 上传文件到所有启用的提供者
|
|
/// </summary>
|
|
/// <param name="filePath">文件路径</param>
|
|
/// <param name="cancellationToken">取消令牌</param>
|
|
/// <returns>是否至少有一个提供者上传成功</returns>
|
|
public static async Task<bool> UploadFileAsync(string filePath, CancellationToken cancellationToken = default)
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
List<IUploadProvider> providersSnapshot;
|
|
lock (s_sync)
|
|
{
|
|
providersSnapshot = new List<IUploadProvider>(_providers);
|
|
}
|
|
|
|
bool anySuccess = false;
|
|
|
|
// 获取上传延迟时间
|
|
int delayMinutes = MainWindow.Settings?.Upload?.UploadDelayMinutes ?? 0;
|
|
|
|
// 应用上传延迟
|
|
if (delayMinutes > 0)
|
|
{
|
|
LogHelper.WriteLogToFile($"上传延迟 {delayMinutes} 分钟", LogHelper.LogType.Event);
|
|
cancellationToken.ThrowIfCancellationRequested();
|
|
await Task.Delay(TimeSpan.FromMinutes(delayMinutes), cancellationToken).ConfigureAwait(false);
|
|
}
|
|
|
|
// 上传前验证文件是否存在且可访问
|
|
if (!File.Exists(filePath))
|
|
{
|
|
LogHelper.WriteLogToFile($"上传失败:文件不存在 - {filePath}", LogHelper.LogType.Error);
|
|
return false;
|
|
}
|
|
|
|
try
|
|
{
|
|
// 检查文件是否可访问
|
|
using (var fileStream = File.OpenRead(filePath))
|
|
{
|
|
// 文件可访问
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogHelper.WriteLogToFile($"上传失败:文件不可访问 - {filePath}, 原因: {ex.Message}", LogHelper.LogType.Error);
|
|
return false;
|
|
}
|
|
|
|
foreach (var provider in providersSnapshot)
|
|
{
|
|
try
|
|
{
|
|
if (provider.IsEnabled)
|
|
{
|
|
bool success = await provider.UploadAsync(filePath, cancellationToken).ConfigureAwait(false);
|
|
if (success)
|
|
{
|
|
anySuccess = true;
|
|
}
|
|
}
|
|
}
|
|
catch (OperationCanceledException)
|
|
{
|
|
LogHelper.WriteLogToFile($"上传被取消: {provider.Name}", LogHelper.LogType.Event);
|
|
throw;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LogHelper.WriteLogToFile($"使用 {provider.Name} 上传失败: {ex}", LogHelper.LogType.Error);
|
|
}
|
|
}
|
|
|
|
return anySuccess;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取所有上传提供者
|
|
/// </summary>
|
|
/// <returns>上传提供者列表</returns>
|
|
public static List<IUploadProvider> GetProviders()
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
lock (s_sync)
|
|
{
|
|
return new List<IUploadProvider>(_providers);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取所有启用的上传提供者
|
|
/// </summary>
|
|
/// <returns>启用的上传提供者列表</returns>
|
|
public static List<IUploadProvider> GetEnabledProviders()
|
|
{
|
|
if (!_initialized)
|
|
{
|
|
Initialize();
|
|
}
|
|
|
|
lock (s_sync)
|
|
{
|
|
return _providers.FindAll(p => p.IsEnabled);
|
|
}
|
|
}
|
|
}
|
|
}
|