Browse Source

Merge pull request #327 from colinin/4.4

dynamically localized resources are initialized at startup time
pull/364/head
yx lin 4 years ago
committed by GitHub
parent
commit
65c100ee24
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicModule.cs
  2. 22
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicOptions.cs
  3. 45
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs
  4. 91
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationResourceContributor.cs
  5. 14
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationDispatcher.cs
  6. 17
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationSubscriber.cs
  7. 10
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationDictionary.cs
  8. 61
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationResetSynchronizer.cs
  9. 33
      aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationSubscriber.cs
  10. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs
  11. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN.Abp.OssManagement.Application.Contracts.csproj
  12. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/AbpOssManagementApplicationContractsModule.cs
  13. 5
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN.Abp.OssManagement.Application.csproj
  14. 12
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/AbpOssManagementApplicationModule.cs
  15. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileValidater.cs
  16. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssManagementApplicationServiceBase.cs
  17. 29
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs
  18. 16
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs
  19. 3
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN.Abp.OssManagement.Domain.Shared.csproj
  20. 10
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/AbpOssManagementDomainSharedModule.cs
  21. 0
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureDefinitionProvider.cs
  22. 0
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureNames.cs
  23. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Localization/Resources/en.json
  24. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Localization/Resources/zh-Hans.json
  25. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/OssManagementErrorCodes.cs
  26. 19
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/AbpOssManagementDomainModule.cs
  27. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/AbpOssManagementFileSystemModule.cs
  28. 15
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs
  29. 8
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainerFactory.cs
  30. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN.Abp.OssManagement.HttpApi.csproj
  31. 28
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/AbpOssManagementHttpApiModule.cs
  32. 9
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/IFileValidater.cs
  33. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs
  34. 12
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs
  35. 20
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.SettingManagement/AbpOssManagementSettingManagementModule.cs
  36. 1
      aspnet-core/modules/oss-management/README.md
  37. 9
      aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/AppPlatformHttpApiHostModule.cs

7
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicModule.cs

@ -1,4 +1,5 @@
using Volo.Abp.EventBus; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EventBus;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -9,5 +10,9 @@ namespace LINGYUN.Abp.Localization.Dynamic
typeof(AbpLocalizationModule))] typeof(AbpLocalizationModule))]
public class AbpLocalizationDynamicModule : AbpModule public class AbpLocalizationDynamicModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddHostedService<DynamicLocalizationInitializeService>();
}
} }
} }

22
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/AbpLocalizationDynamicOptions.cs

@ -0,0 +1,22 @@
using System.Collections.Generic;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class AbpLocalizationDynamicOptions
{
internal LocalizationDictionary LocalizationDictionary { get; }
public AbpLocalizationDynamicOptions()
{
LocalizationDictionary = new LocalizationDictionary();
}
internal void AddOrUpdate(string resourceName, Dictionary<string, ILocalizationDictionary> dictionares)
{
var _dictionares = LocalizationDictionary
.GetOrAdd(resourceName, () => new Dictionary<string, ILocalizationDictionary>());
_dictionares.AddIfNotContains(dictionares);
}
}
}

45
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationInitializeService.cs

@ -0,0 +1,45 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class DynamicLocalizationInitializeService : IHostedService
{
protected ILocalizationStore Store { get; }
protected AbpLocalizationOptions LocalizationOptions { get; }
protected AbpLocalizationDynamicOptions DynamicOptions { get; }
public DynamicLocalizationInitializeService(
ILocalizationStore store,
IOptions<AbpLocalizationOptions> localizationOptions,
IOptions<AbpLocalizationDynamicOptions> dynamicOptions)
{
Store = store;
DynamicOptions = dynamicOptions.Value;
LocalizationOptions = localizationOptions.Value;
}
public virtual async Task StartAsync(CancellationToken cancellationToken)
{
foreach (var resource in LocalizationOptions.Resources)
{
foreach (var contributor in resource.Value.Contributors)
{
if (contributor.GetType().IsAssignableFrom(typeof(DynamicLocalizationResourceContributor)))
{
var resourceLocalizationDic = await Store.GetLocalizationDictionaryAsync(resource.Value.ResourceName);
DynamicOptions.AddOrUpdate(resource.Value.ResourceName, resourceLocalizationDic);
}
}
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}

91
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/DynamicLocalizationResourceContributor.cs

@ -1,27 +1,16 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options;
using Nito.AsyncEx;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Threading;
namespace LINGYUN.Abp.Localization.Dynamic namespace LINGYUN.Abp.Localization.Dynamic
{ {
public class DynamicLocalizationResourceContributor : ILocalizationResourceContributor public class DynamicLocalizationResourceContributor : ILocalizationResourceContributor
{ {
private ILogger _logger;
private ILocalizationSubscriber _subscriber;
private ILocalizationStore _store;
protected ILocalizationStore Store => _store;
private Dictionary<string, ILocalizationDictionary> _dictionaries;
private readonly string _resourceName; private readonly string _resourceName;
private readonly AsyncLock _asyncLock = new AsyncLock();
private AbpLocalizationDynamicOptions _options;
public DynamicLocalizationResourceContributor(string resourceName) public DynamicLocalizationResourceContributor(string resourceName)
{ {
@ -30,11 +19,7 @@ namespace LINGYUN.Abp.Localization.Dynamic
public virtual void Initialize(LocalizationResourceInitializationContext context) public virtual void Initialize(LocalizationResourceInitializationContext context)
{ {
_logger = context.ServiceProvider.GetService<ILogger<DynamicLocalizationResourceContributor>>(); _options = context.ServiceProvider.GetService<IOptions<AbpLocalizationDynamicOptions>>().Value;
_store = context.ServiceProvider.GetRequiredService<ILocalizationStore>();
_subscriber = context.ServiceProvider.GetRequiredService<ILocalizationSubscriber>();
_subscriber.Subscribe(OnChanged);
} }
public virtual void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary) public virtual void Fill(string cultureName, Dictionary<string, LocalizedString> dictionary)
@ -49,72 +34,8 @@ namespace LINGYUN.Abp.Localization.Dynamic
protected virtual Dictionary<string, ILocalizationDictionary> GetDictionaries() protected virtual Dictionary<string, ILocalizationDictionary> GetDictionaries()
{ {
var dictionaries = _dictionaries; return _options.LocalizationDictionary
if (dictionaries != null) .GetOrAdd(_resourceName, () => new Dictionary<string, ILocalizationDictionary>());
{
return dictionaries;
}
try
{
using (_asyncLock.Lock())
{
dictionaries = _dictionaries = AsyncHelper.RunSync(async () =>
await Store.GetLocalizationDictionaryAsync(_resourceName));
}
}
catch(Exception ex)
{
// 错误不应该影响到应用程序,而是记录到日志
_logger?.LogWarning("Failed to get localized text, error: ", ex.Message);
}
return dictionaries;
}
private Task OnChanged(LocalizedStringCacheResetEventData data)
{
if (string.Equals(_resourceName, data.ResourceName))
{
if (!_dictionaries.ContainsKey(data.CultureName))
{
// TODO: 需要处理 data.Key data.Value 空引用
var dictionary = new Dictionary<string, LocalizedString>();
dictionary.Add(data.Key, new LocalizedString(data.Key, data.Value.NormalizeLineEndings()));
var newLocalizationDictionary = new StaticLocalizationDictionary(data.CultureName, dictionary);
_dictionaries.Add(data.CultureName, newLocalizationDictionary);
}
else
{
// 取出当前的缓存写入到新字典进行处理
var nowLocalizationDictionary = _dictionaries[data.CultureName];
var dictionary = new Dictionary<string, LocalizedString>();
nowLocalizationDictionary.Fill(dictionary);
var existsKey = dictionary.ContainsKey(data.Key);
if (!existsKey)
{
// 如果不存在,则新增
dictionary.Add(data.Key, new LocalizedString(data.Key, data.Value.NormalizeLineEndings()));
}
else if (existsKey && data.IsDeleted)
{
// 如果删掉了本地化的节点,删掉当前的缓存
dictionary.Remove(data.Key);
}
var newLocalizationDictionary = new StaticLocalizationDictionary(data.CultureName, dictionary);
if (newLocalizationDictionary != null)
{
// 重新赋值变更过的缓存
_dictionaries[data.CultureName] = newLocalizationDictionary;
}
}
}
return Task.CompletedTask;
} }
} }
} }

14
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationDispatcher.cs

@ -1,14 +0,0 @@
using System.Threading.Tasks;
namespace LINGYUN.Abp.Localization.Dynamic
{
internal interface ILocalizationDispatcher
{
/// <summary>
/// 发布变更事件
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
Task DispatchAsync(LocalizedStringCacheResetEventData data);
}
}

17
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/ILocalizationSubscriber.cs

@ -1,17 +0,0 @@
using System;
using System.Threading.Tasks;
namespace LINGYUN.Abp.Localization.Dynamic
{
/// <summary>
/// 本地化资源订阅
/// </summary>
internal interface ILocalizationSubscriber
{
/// <summary>
/// 订阅变更事件
/// </summary>
/// <param name="func"></param>
void Subscribe(Func<LocalizedStringCacheResetEventData, Task> func);
}
}

10
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationDictionary.cs

@ -0,0 +1,10 @@
using System.Collections.Generic;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic
{
public class LocalizationDictionary : Dictionary<string, Dictionary<string, ILocalizationDictionary>>
{
}
}

61
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationResetSynchronizer.cs

@ -1,6 +1,11 @@
using System.Threading.Tasks; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.Localization.Dynamic namespace LINGYUN.Abp.Localization.Dynamic
{ {
@ -8,16 +13,60 @@ namespace LINGYUN.Abp.Localization.Dynamic
IDistributedEventHandler<LocalizedStringCacheResetEventData>, IDistributedEventHandler<LocalizedStringCacheResetEventData>,
ITransientDependency ITransientDependency
{ {
private readonly ILocalizationDispatcher _dispatcher; private readonly AbpLocalizationDynamicOptions _options;
public LocalizationResetSynchronizer( public LocalizationResetSynchronizer(
ILocalizationDispatcher dispatcher) IOptions<AbpLocalizationDynamicOptions> options)
{ {
_dispatcher = dispatcher; _options = options.Value;
} }
public async Task HandleEventAsync(LocalizedStringCacheResetEventData eventData) public virtual Task HandleEventAsync(LocalizedStringCacheResetEventData eventData)
{ {
await _dispatcher.DispatchAsync(eventData); var dictionaries = GetDictionaries(eventData.ResourceName);
if (!dictionaries.ContainsKey(eventData.CultureName))
{
// TODO: 需要处理 data.Key data.Value 空引用
var dictionary = new Dictionary<string, LocalizedString>();
dictionary.Add(eventData.Key, new LocalizedString(eventData.Key, eventData.Value.NormalizeLineEndings()));
var newLocalizationDictionary = new StaticLocalizationDictionary(eventData.CultureName, dictionary);
dictionaries.Add(eventData.CultureName, newLocalizationDictionary);
}
else
{
// 取出当前的缓存写入到新字典进行处理
var nowLocalizationDictionary = dictionaries[eventData.CultureName];
var dictionary = new Dictionary<string, LocalizedString>();
nowLocalizationDictionary.Fill(dictionary);
var existsKey = dictionary.ContainsKey(eventData.Key);
if (!existsKey)
{
// 如果不存在,则新增
dictionary.Add(eventData.Key, new LocalizedString(eventData.Key, eventData.Value.NormalizeLineEndings()));
}
else if (existsKey && eventData.IsDeleted)
{
// 如果删掉了本地化的节点,删掉当前的缓存
dictionary.Remove(eventData.Key);
}
var newLocalizationDictionary = new StaticLocalizationDictionary(eventData.CultureName, dictionary);
if (newLocalizationDictionary != null)
{
// 重新赋值变更过的缓存
dictionaries[eventData.CultureName] = newLocalizationDictionary;
}
}
return Task.CompletedTask;
}
protected virtual Dictionary<string, ILocalizationDictionary> GetDictionaries(string resourceName)
{
return _options.LocalizationDictionary
.GetOrAdd(resourceName, () => new Dictionary<string, ILocalizationDictionary>());
} }
} }
} }

33
aspnet-core/modules/common/LINGYUN.Abp.Localization.Dynamic/LINGYUN/Abp/Localization/Dynamic/LocalizationSubscriber.cs

@ -1,33 +0,0 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.Localization.Dynamic
{
[ExposeServices(
typeof(ILocalizationSubscriber),
typeof(ILocalizationDispatcher),
typeof(LocalizationSubscriber))]
internal class LocalizationSubscriber : ILocalizationSubscriber, ILocalizationDispatcher, ISingletonDependency
{
private Func<LocalizedStringCacheResetEventData, Task> _handler;
public LocalizationSubscriber()
{
_handler = (d) =>
{
return Task.CompletedTask;
};
}
public void Subscribe(Func<LocalizedStringCacheResetEventData, Task> func)
{
_handler += func;
}
public virtual async Task DispatchAsync(LocalizedStringCacheResetEventData data)
{
await _handler(data);
}
}
}

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs

@ -126,6 +126,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
public virtual async Task DeleteAsync(string name) public virtual async Task DeleteAsync(string name)
{ {
// 阿里云oss在控制台设置即可,无需改变
var ossClient = await CreateClientAsync(); var ossClient = await CreateClientAsync();
if (BucketExists(ossClient, name)) if (BucketExists(ossClient, name))

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN.Abp.OssManagement.Application.Contracts.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" /> <Import Project="..\..\..\common.props" />
@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Ddd.Application" Version="4.4.0" /> <PackageReference Include="Volo.Abp.Ddd.Application.Contracts" Version="4.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/AbpOssManagementApplicationContractsModule.cs

@ -5,7 +5,7 @@ namespace LINGYUN.Abp.OssManagement
{ {
[DependsOn( [DependsOn(
typeof(AbpOssManagementDomainSharedModule), typeof(AbpOssManagementDomainSharedModule),
typeof(AbpDddApplicationModule))] typeof(AbpDddApplicationContractsModule))]
public class AbpOssManagementApplicationContractsModule : AbpModule public class AbpOssManagementApplicationContractsModule : AbpModule
{ {
} }

5
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN.Abp.OssManagement.Application.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" /> <Import Project="..\..\..\common.props" />
@ -9,9 +9,12 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.AutoMapper" Version="4.4.0" /> <PackageReference Include="Volo.Abp.AutoMapper" Version="4.4.0" />
<PackageReference Include="Volo.Abp.Ddd.Application" Version="4.4.0" />
<PackageReference Include="Volo.Abp.Caching" Version="4.4.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.OssManagement.Domain\LINGYUN.Abp.OssManagement.Domain.csproj" />
</ItemGroup> </ItemGroup>

12
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/AbpOssManagementApplicationModule.cs

@ -1,13 +1,17 @@
using Volo.Abp.AutoMapper; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Application;
using Volo.Abp.AutoMapper;
using Volo.Abp.Caching;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Microsoft.Extensions.DependencyInjection;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
[DependsOn( [DependsOn(
typeof(AbpAutoMapperModule),
typeof(AbpOssManagementDomainModule), typeof(AbpOssManagementDomainModule),
typeof(AbpOssManagementApplicationContractsModule))] typeof(AbpOssManagementApplicationContractsModule),
typeof(AbpCachingModule),
typeof(AbpAutoMapperModule),
typeof(AbpDddApplicationModule))]
public class AbpOssManagementApplicationModule : AbpModule public class AbpOssManagementApplicationModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/FileValidater.cs → aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileValidater.cs

@ -31,7 +31,7 @@ namespace LINGYUN.Abp.OssManagement
_stringLocalizer = stringLocalizer; _stringLocalizer = stringLocalizer;
} }
public virtual async Task ValidationAsync(UploadOssObjectInput input) public virtual async Task ValidationAsync(UploadFile input)
{ {
var validation = await GetByCacheItemAsync(); var validation = await GetByCacheItemAsync();
if (validation.SizeLimit * 1024 * 1024 < input.TotalSize) if (validation.SizeLimit * 1024 * 1024 < input.TotalSize)

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssManagementApplicationServiceBase.cs

@ -3,7 +3,7 @@ using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class OssManagementApplicationServiceBase : ApplicationService public abstract class OssManagementApplicationServiceBase : ApplicationService
{ {
protected OssManagementApplicationServiceBase() protected OssManagementApplicationServiceBase()
{ {

29
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs

@ -1,17 +1,13 @@
using LINGYUN.Abp.Features.LimitValidation; using LINGYUN.Abp.Features.LimitValidation;
using LINGYUN.Abp.OssManagement.Features; using LINGYUN.Abp.OssManagement.Features;
using LINGYUN.Abp.OssManagement.Permissions; using LINGYUN.Abp.OssManagement.Permissions;
using LINGYUN.Abp.OssManagement.Settings;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.IO; using System.IO;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Features; using Volo.Abp.Features;
using Volo.Abp.IO;
using Volo.Abp.Settings;
using Volo.Abp.Validation; using Volo.Abp.Validation;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
@ -19,11 +15,14 @@ namespace LINGYUN.Abp.OssManagement
[Authorize(AbpOssManagementPermissions.OssObject.Default)] [Authorize(AbpOssManagementPermissions.OssObject.Default)]
public class OssObjectAppService : OssManagementApplicationServiceBase, IOssObjectAppService public class OssObjectAppService : OssManagementApplicationServiceBase, IOssObjectAppService
{ {
protected IFileValidater FileValidater { get; }
protected IOssContainerFactory OssContainerFactory { get; } protected IOssContainerFactory OssContainerFactory { get; }
public OssObjectAppService( public OssObjectAppService(
IFileValidater fileValidater,
IOssContainerFactory ossContainerFactory) IOssContainerFactory ossContainerFactory)
{ {
FileValidater = fileValidater;
OssContainerFactory = ossContainerFactory; OssContainerFactory = ossContainerFactory;
} }
@ -37,25 +36,11 @@ namespace LINGYUN.Abp.OssManagement
{ {
if (!input.Content.IsNullOrEmpty()) if (!input.Content.IsNullOrEmpty())
{ {
// 检查文件大小 await FileValidater.ValidationAsync(new UploadFile
var fileSizeLimited = await SettingProvider
.GetAsync(
AbpOssManagementSettingNames.FileLimitLength,
AbpOssManagementSettingNames.DefaultFileLimitLength);
if (fileSizeLimited * 1024 * 1024 < input.Content.Length)
{ {
ThrowValidationException(L["UploadFileSizeBeyondLimit", fileSizeLimited], nameof(input.Content)); TotalSize = input.Content.Length,
} FileName = input.Object
});
// 文件扩展名
var fileExtensionName = FileHelper.GetExtension(input.Object);
var fileAllowExtension = await SettingProvider.GetOrNullAsync(AbpOssManagementSettingNames.AllowFileExtensions);
// 检查文件扩展名
if (!fileAllowExtension.Split(',')
.Any(fe => fe.Equals(fileExtensionName, StringComparison.CurrentCultureIgnoreCase)))
{
ThrowValidationException(L["NotAllowedFileExtensionName", fileExtensionName], "FileName");
}
} }
var oss = CreateOssContainer(); var oss = CreateOssContainer();

16
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs

@ -0,0 +1,16 @@
namespace LINGYUN.Abp.OssManagement
{
public class PublicFileAppService : FileAppServiceBase, IPublicFileAppService
{
public PublicFileAppService(
IFileValidater fileValidater,
IOssContainerFactory ossContainerFactory)
: base(fileValidater, ossContainerFactory)
{
}
protected override string GetCurrentBucket()
{
return "public";
}
}
}

3
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN.Abp.OssManagement.Domain.Shared.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" /> <Import Project="..\..\..\common.props" />
@ -18,6 +18,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Volo.Abp.Features" Version="4.4.0" />
<PackageReference Include="Volo.Abp.Validation" Version="4.4.0" /> <PackageReference Include="Volo.Abp.Validation" Version="4.4.0" />
</ItemGroup> </ItemGroup>

10
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/AbpOssManagementDomainSharedModule.cs

@ -1,14 +1,16 @@
using LINGYUN.Abp.OssManagement.Localization; using LINGYUN.Abp.OssManagement.Localization;
using Volo.Abp.Features;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Localization.ExceptionHandling; using Volo.Abp.Localization.ExceptionHandling;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.Abp.Validation.Localization;
using Volo.Abp.VirtualFileSystem; using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
[DependsOn(typeof(AbpValidationModule))] [DependsOn(
typeof(AbpFeaturesModule),
typeof(AbpValidationModule))]
public class AbpOssManagementDomainSharedModule : AbpModule public class AbpOssManagementDomainSharedModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
@ -22,9 +24,7 @@ namespace LINGYUN.Abp.OssManagement
{ {
options.Resources options.Resources
.Add<AbpOssManagementResource>("en") .Add<AbpOssManagementResource>("en")
.AddBaseTypes( .AddVirtualJson("/LINGYUN/Abp/OssManagement/Localization/Resources");
typeof(AbpValidationResource)
).AddVirtualJson("/LINGYUN/Abp/OssManagement/Localization/Resources");
}); });
Configure<AbpExceptionLocalizationOptions>(options => Configure<AbpExceptionLocalizationOptions>(options =>

0
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureDefinitionProvider.cs → aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureDefinitionProvider.cs

0
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureNames.cs → aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Features/AbpOssManagementFeatureNames.cs

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Localization/Resources/en.json

@ -1,6 +1,7 @@
{ {
"culture": "en", "culture": "en",
"texts": { "texts": {
"Abp.OssManagement:010000": "System definition containers cannot be deleted!",
"Abp.OssManagement:010001": "Cannot delete a container that has more than one object!", "Abp.OssManagement:010001": "Cannot delete a container that has more than one object!",
"Abp.OssManagement:010402": "The container name already exists!", "Abp.OssManagement:010402": "The container name already exists!",
"Abp.OssManagement:010404": "The queried container could not be found!", "Abp.OssManagement:010404": "The queried container could not be found!",

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/Localization/Resources/zh-Hans.json

@ -1,6 +1,7 @@
{ {
"culture": "zh-Hans", "culture": "zh-Hans",
"texts": { "texts": {
"Abp.OssManagement:010000": "不能删除系统定义容器!",
"Abp.OssManagement:010001": "不能删除存在多个对象的容器!", "Abp.OssManagement:010001": "不能删除存在多个对象的容器!",
"Abp.OssManagement:010402": "容器名称已经存在!", "Abp.OssManagement:010402": "容器名称已经存在!",
"Abp.OssManagement:010404": "未能找到查询的容器!", "Abp.OssManagement:010404": "未能找到查询的容器!",

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain.Shared/LINGYUN/Abp/OssManagement/OssManagementErrorCodes.cs

@ -4,6 +4,7 @@
{ {
public const string Namespace = "Abp.OssManagement"; public const string Namespace = "Abp.OssManagement";
public const string ContainerDeleteWithStatic = Namespace + ":010000";
public const string ContainerDeleteWithNotEmpty = Namespace + ":010001"; public const string ContainerDeleteWithNotEmpty = Namespace + ":010001";
public const string ContainerAlreadyExists = Namespace + ":010402"; public const string ContainerAlreadyExists = Namespace + ":010402";
public const string ContainerNotFound = Namespace + ":010404"; public const string ContainerNotFound = Namespace + ":010404";

19
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/AbpOssManagementDomainModule.cs

@ -1,4 +1,7 @@
using LINGYUN.Abp.Features.LimitValidation; using LINGYUN.Abp.Features.LimitValidation;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.Domain; using Volo.Abp.Domain;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
@ -6,12 +9,24 @@ using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
[DependsOn( [DependsOn(
typeof(AbpOssManagementDomainSharedModule),
typeof(AbpDddDomainModule), typeof(AbpDddDomainModule),
typeof(AbpMultiTenancyModule), typeof(AbpMultiTenancyModule),
typeof(AbpFeaturesLimitValidationModule), typeof(AbpFeaturesLimitValidationModule)
typeof(AbpOssManagementDomainSharedModule)
)] )]
public class AbpOssManagementDomainModule : AbpModule public class AbpOssManagementDomainModule : AbpModule
{ {
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
// TODO: 是否有必要自动创建容器
var ossOptions = context.ServiceProvider.GetRequiredService<IOptions<AbpOssManagementOptions>>().Value;
var ossFactory = context.ServiceProvider.GetRequiredService<IOssContainerFactory>();
var ossContainer = ossFactory.Create();
foreach (var bucket in ossOptions.StaticBuckets)
{
_ = ossContainer.CreateIfNotExistsAsync(bucket);
}
}
} }
} }

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/AbpOssManagementFileSystemModule.cs

@ -1,4 +1,6 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp;
using Volo.Abp.BlobStoring.FileSystem; using Volo.Abp.BlobStoring.FileSystem;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;

15
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs

@ -25,6 +25,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } protected IBlobContainerConfigurationProvider ConfigurationProvider { get; }
protected IServiceProvider ServiceProvider { get; } protected IServiceProvider ServiceProvider { get; }
protected FileSystemOssOptions Options { get; } protected FileSystemOssOptions Options { get; }
protected AbpOssManagementOptions OssOptions { get; }
public FileSystemOssContainer( public FileSystemOssContainer(
ICurrentTenant currentTenant, ICurrentTenant currentTenant,
@ -32,7 +33,8 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IBlobFilePathCalculator blobFilePathCalculator, IBlobFilePathCalculator blobFilePathCalculator,
IBlobContainerConfigurationProvider configurationProvider, IBlobContainerConfigurationProvider configurationProvider,
IOptions<FileSystemOssOptions> options) IOptions<FileSystemOssOptions> options,
IOptions<AbpOssManagementOptions> ossOptions)
{ {
CurrentTenant = currentTenant; CurrentTenant = currentTenant;
Environment = environment; Environment = environment;
@ -40,6 +42,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
FilePathCalculator = blobFilePathCalculator; FilePathCalculator = blobFilePathCalculator;
ConfigurationProvider = configurationProvider; ConfigurationProvider = configurationProvider;
Options = options.Value; Options = options.Value;
OssOptions = ossOptions.Value;
} }
public virtual Task BulkDeleteObjectsAsync(BulkDeleteObjectRequest request) public virtual Task BulkDeleteObjectsAsync(BulkDeleteObjectRequest request)
@ -173,6 +176,8 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
public virtual Task DeleteAsync(string name) public virtual Task DeleteAsync(string name)
{ {
CheckStaticBucket(name);
var filePath = CalculateFilePath(name); var filePath = CalculateFilePath(name);
if (!Directory.Exists(filePath)) if (!Directory.Exists(filePath))
{ {
@ -533,6 +538,14 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
return blobPath; return blobPath;
} }
protected virtual void CheckStaticBucket(string bucket)
{
if (OssOptions.CheckStaticBucket(bucket))
{
throw new BusinessException(code: OssManagementErrorCodes.ContainerDeleteWithStatic);
}
}
private void ThrowOfPathHasTooLong(string path) private void ThrowOfPathHasTooLong(string path)
{ {
// Windows 133 260 // Windows 133 260

8
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainerFactory.cs

@ -15,6 +15,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
protected IBlobFilePathCalculator FilePathCalculator { get; } protected IBlobFilePathCalculator FilePathCalculator { get; }
protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } protected IBlobContainerConfigurationProvider ConfigurationProvider { get; }
protected IOptions<FileSystemOssOptions> Options { get; } protected IOptions<FileSystemOssOptions> Options { get; }
protected IOptions<AbpOssManagementOptions> OssOptions { get; }
public FileSystemOssContainerFactory( public FileSystemOssContainerFactory(
ICurrentTenant currentTenant, ICurrentTenant currentTenant,
@ -22,7 +23,8 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
IBlobFilePathCalculator blobFilePathCalculator, IBlobFilePathCalculator blobFilePathCalculator,
IBlobContainerConfigurationProvider configurationProvider, IBlobContainerConfigurationProvider configurationProvider,
IOptions<FileSystemOssOptions> options) IOptions<FileSystemOssOptions> options,
IOptions<AbpOssManagementOptions> ossOptions)
{ {
Environment = environment; Environment = environment;
CurrentTenant = currentTenant; CurrentTenant = currentTenant;
@ -30,6 +32,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
FilePathCalculator = blobFilePathCalculator; FilePathCalculator = blobFilePathCalculator;
ConfigurationProvider = configurationProvider; ConfigurationProvider = configurationProvider;
Options = options; Options = options;
OssOptions = ossOptions;
} }
public IOssContainer Create() public IOssContainer Create()
@ -40,7 +43,8 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
ServiceProvider, ServiceProvider,
FilePathCalculator, FilePathCalculator,
ConfigurationProvider, ConfigurationProvider,
Options); Options,
OssOptions);
} }
} }
} }

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN.Abp.OssManagement.HttpApi.csproj

@ -12,7 +12,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\common\LINGYUN.Abp.Settings\LINGYUN.Abp.Settings.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" /> <ProjectReference Include="..\LINGYUN.Abp.OssManagement.Application.Contracts\LINGYUN.Abp.OssManagement.Application.Contracts.csproj" />
</ItemGroup> </ItemGroup>

28
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/AbpOssManagementHttpApiModule.cs

@ -1,6 +1,12 @@
using Microsoft.Extensions.DependencyInjection; using LINGYUN.Abp.OssManagement.Localization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Authorization.Localization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Validation.Localization;
using Volo.Abp.AspNetCore.Mvc.DataAnnotations;
using Volo.Abp.AspNetCore.Mvc.Localization;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
@ -16,6 +22,26 @@ namespace LINGYUN.Abp.OssManagement
{ {
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpOssManagementHttpApiModule).Assembly); mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpOssManagementHttpApiModule).Assembly);
}); });
PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(
typeof(AbpOssManagementResource),
typeof(AbpOssManagementApplicationContractsModule).Assembly);
});
} }
//public override void ConfigureServices(ServiceConfigurationContext context)
//{
// Configure<AbpLocalizationOptions>(options =>
// {
// options.Resources
// .Get<AbpOssManagementResource>()
// .AddBaseTypes(
// typeof(AbpAuthorizationResource),
// typeof(AbpValidationResource)
// );
// });
//}
} }
} }

9
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/IFileValidater.cs

@ -1,9 +0,0 @@
using System.Threading.Tasks;
namespace LINGYUN.Abp.OssManagement
{
public interface IFileValidater
{
Task ValidationAsync(UploadOssObjectInput input);
}
}

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs

@ -1,7 +1,6 @@
using LINGYUN.Abp.OssManagement.Localization; using LINGYUN.Abp.OssManagement.Localization;
using LINGYUN.Abp.OssManagement.Permissions; using LINGYUN.Abp.OssManagement.Permissions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@ -15,9 +14,10 @@ using Volo.Abp.Validation;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
[RemoteService(Name = OssManagementRemoteServiceConsts.RemoteServiceName)]
[Area("oss-management")] [Area("oss-management")]
[Route("api/files/static")] [Route("api/files/static")]
[RemoteService(false)]
[ApiExplorerSettings(IgnoreApi = true)]
public class StaticFilesController : AbpController public class StaticFilesController : AbpController
{ {
private readonly IOssObjectAppService _ossObjectAppService; private readonly IOssObjectAppService _ossObjectAppService;

12
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs

@ -3,18 +3,13 @@ using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class UploadOssObjectInput public class UploadOssObjectInput : UploadFile
{ {
public string Bucket { get; set; } public string Bucket { get; set; }
public string Path { get; set; } public string Path { get; set; }
#region 配合Uplaoder 分块传输 #region 配合Uplaoder 分块传输
/// <summary> /// <summary>
/// 文件名
/// </summary>
[Required]
public string FileName { get; set; }
/// <summary>
/// 常规块大小 /// 常规块大小
/// </summary> /// </summary>
[Required] [Required]
@ -34,11 +29,6 @@ namespace LINGYUN.Abp.OssManagement
/// </summary> /// </summary>
[Required] [Required]
public int TotalChunks { get; set; } public int TotalChunks { get; set; }
/// <summary>
/// 总文件大小
/// </summary>
[Required]
public long TotalSize { get; set; }
#endregion #endregion

20
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.SettingManagement/AbpOssManagementSettingManagementModule.cs

@ -1,20 +0,0 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.OssManagement.SettingManagement
{
[DependsOn(
typeof(AbpOssManagementApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule))]
public class AbpOssManagementSettingManagementModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpOssManagementSettingManagementModule).Assembly);
});
}
}
}

1
aspnet-core/modules/oss-management/README.md

@ -48,3 +48,4 @@ File-Management更名为Oss-Management
## 更新日志 ## 更新日志
*【2021-03-10】 变更FileManagement命名空间为OssManagement *【2021-03-10】 变更FileManagement命名空间为OssManagement
*【2021-10-22】 增加PublicFilesController用于身份认证通过的用户上传/下载文件,所有操作限定在用户目录下

9
aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/AppPlatformHttpApiHostModule.cs

@ -172,6 +172,13 @@ namespace LINGYUN.Platform
options.Handlers.Add<Microsoft.EntityFrameworkCore.DbUpdateException>(); options.Handlers.Add<Microsoft.EntityFrameworkCore.DbUpdateException>();
options.Handlers.Add<System.Data.DBConcurrencyException>(); options.Handlers.Add<System.Data.DBConcurrencyException>();
}); });
Configure<Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingOptions>(options =>
{
// 是否发送错误详情
options.SendExceptionsDetailsToClients = false;
});
// 自定义需要发送邮件通知的异常类型 // 自定义需要发送邮件通知的异常类型
Configure<AbpEmailExceptionHandlingOptions>(options => Configure<AbpEmailExceptionHandlingOptions>(options =>
{ {
@ -319,6 +326,8 @@ namespace LINGYUN.Platform
}); });
// 审计日志 // 审计日志
app.UseAuditing(); app.UseAuditing();
// 工作单元
app.UseUnitOfWork();
// 路由 // 路由
app.UseConfiguredEndpoints(); app.UseConfiguredEndpoints();

Loading…
Cancel
Save