This commit is contained in:
parent
946c9abaca
commit
2c3a884264
@ -1,6 +1,6 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!-- All Fake packages -->
|
<!-- All Fake packages -->
|
||||||
<FakePackageVersion>8.0.5.16</FakePackageVersion>
|
<FakePackageVersion>8.0.5.17</FakePackageVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@ -4,5 +4,20 @@
|
|||||||
"Default": "Debug",
|
"Default": "Debug",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"ObjectStorage": {
|
||||||
|
"Provider": "TencentCos",
|
||||||
|
"SignUrlsByDefault": true,
|
||||||
|
"DefaultSignedUrlExpiresSeconds": 900,
|
||||||
|
"DefaultUploadExpiresSeconds": 600,
|
||||||
|
"TencentCos": {
|
||||||
|
"Region": "ap-guangzhou",
|
||||||
|
"SecretId": "替换为腾讯云SecretId",
|
||||||
|
"SecretKey": "替换为腾讯云SecretKey",
|
||||||
|
"Bucket": "your-bucket-1250000000",
|
||||||
|
"UseHttps": true,
|
||||||
|
"SignUrls": true,
|
||||||
|
"DurationSecond": 600
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,9 +5,9 @@ using System.Text.RegularExpressions;
|
|||||||
using System.Web;
|
using System.Web;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using Fake.DependencyInjection;
|
using Fake.DependencyInjection;
|
||||||
|
using Fake.ObjectStorage;
|
||||||
using InterfaceForward.Application.Contracts.ForwardCore;
|
using InterfaceForward.Application.Contracts.ForwardCore;
|
||||||
using InterfaceForward.Application.Helpers;
|
using InterfaceForward.Application.Helpers;
|
||||||
using InterfaceForward.Application.OSS;
|
|
||||||
using InterfaceForward.Domain.Shared;
|
using InterfaceForward.Domain.Shared;
|
||||||
using InterfaceForward.Domain.Shared.Enum;
|
using InterfaceForward.Domain.Shared.Enum;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
@ -23,6 +23,7 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
{
|
{
|
||||||
private static readonly ConcurrentDictionary<string, Delegate> DelegateDic = new();
|
private static readonly ConcurrentDictionary<string, Delegate> DelegateDic = new();
|
||||||
[Inject] public IHttpClientFactory ClientFactory { get; set; } = null!;
|
[Inject] public IHttpClientFactory ClientFactory { get; set; } = null!;
|
||||||
|
[Inject] public IObjectStorage ObjectStorage { get; set; } = null!;
|
||||||
|
|
||||||
public virtual Task<JToken> InParamRestructure(ForwardCoreContext context)
|
public virtual Task<JToken> InParamRestructure(ForwardCoreContext context)
|
||||||
{
|
{
|
||||||
@ -90,7 +91,7 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
if (tokens.Count == 0) tokens = response.SelectTokens($"{pdfLabelConfig.Path}").ToList();
|
if (tokens.Count == 0) tokens = response.SelectTokens($"{pdfLabelConfig.Path}").ToList();
|
||||||
if (tokens.Count == 0) return mappedRes;
|
if (tokens.Count == 0) return mappedRes;
|
||||||
var token = tokens.First();
|
var token = tokens.First();
|
||||||
UploadResultDto oss = null!;
|
ObjectStorageSaveResult? oss = null;
|
||||||
switch (Enum.Parse<LabelType>(pdfLabelConfig.Value))
|
switch (Enum.Parse<LabelType>(pdfLabelConfig.Value))
|
||||||
{
|
{
|
||||||
case LabelType.Url:
|
case LabelType.Url:
|
||||||
@ -98,14 +99,14 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
string url = token.Value<string>()!;
|
string url = token.Value<string>()!;
|
||||||
using var r = await ClientFactory.CreateClient().GetAsync(url);
|
using var r = await ClientFactory.CreateClient().GetAsync(url);
|
||||||
await using var stream = await r.Content.ReadAsStreamAsync();
|
await using var stream = await r.Content.ReadAsStreamAsync();
|
||||||
oss = OSSHelper.Upload(stream, Guid.NewGuid().ToString("D") + ".pdf");
|
oss = await SaveObjectAsync(stream, Guid.NewGuid().ToString("D") + ".pdf");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LabelType.Base64:
|
case LabelType.Base64:
|
||||||
byte[] bytes = Convert.FromBase64String(token.ToString());
|
byte[] bytes = Convert.FromBase64String(token.ToString());
|
||||||
if (bytes.Length > 0)
|
if (bytes.Length > 0)
|
||||||
{
|
{
|
||||||
oss = OSSHelper.Upload(new MemoryStream(bytes), Guid.NewGuid().ToString("D") + ".pdf");
|
oss = await SaveObjectAsync(new MemoryStream(bytes), Guid.NewGuid().ToString("D") + ".pdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -113,8 +114,11 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
mappedRes["oss_key"] = oss.Key;
|
if (oss != null)
|
||||||
mappedRes["oss_url"] = oss.TempUrl;
|
{
|
||||||
|
mappedRes["oss_key"] = oss.ObjectKey;
|
||||||
|
mappedRes["oss_url"] = oss.Url;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -379,19 +383,19 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
var base64 = await response.Content.ReadAsStringAsync();
|
var base64 = await response.Content.ReadAsStringAsync();
|
||||||
byte[] pdfBytes = Convert.FromBase64String(base64);
|
byte[] pdfBytes = Convert.FromBase64String(base64);
|
||||||
using MemoryStream stream = new MemoryStream(pdfBytes);
|
using MemoryStream stream = new MemoryStream(pdfBytes);
|
||||||
var ans = OSSHelper.Upload(stream, Guid.NewGuid().ToString("D") + ".pdf");
|
var ans = await SaveObjectAsync(stream, Guid.NewGuid().ToString("D") + ".pdf");
|
||||||
return JsonConvert.SerializeObject(ans);
|
return SerializeObjectStorageResult(ans);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 流
|
// 流
|
||||||
if (context.TargetInterface.ResponseContentType is ResponseContentType.csv or ResponseContentType.pdf)
|
if (context.TargetInterface.ResponseContentType is ResponseContentType.csv or ResponseContentType.pdf)
|
||||||
{
|
{
|
||||||
// 上传oss
|
// 上传对象存储
|
||||||
string suffix = context.TargetInterface.ResponseContentType == ResponseContentType.csv ? "csv" : "pdf";
|
string suffix = context.TargetInterface.ResponseContentType == ResponseContentType.csv ? "csv" : "pdf";
|
||||||
await using var stream = await response.Content.ReadAsStreamAsync();
|
await using var stream = await response.Content.ReadAsStreamAsync();
|
||||||
|
|
||||||
var ans = OSSHelper.Upload(stream, Guid.NewGuid().ToString("D") + "." + suffix);
|
var ans = await SaveObjectAsync(stream, Guid.NewGuid().ToString("D") + "." + suffix);
|
||||||
return JsonConvert.SerializeObject(ans);
|
return SerializeObjectStorageResult(ans);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.Content.Headers.ContentType?.CharSet?.ToUpper() == "GBK")
|
if (response.Content.Headers.ContentType?.CharSet?.ToUpper() == "GBK")
|
||||||
@ -697,4 +701,27 @@ public class DefaultForwardFlow : IForwardFlow, ITransientDependency
|
|||||||
@delegate.DynamicInvoke(context);
|
@delegate.DynamicInvoke(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Task<ObjectStorageSaveResult> SaveObjectAsync(Stream content, string objectKey)
|
||||||
|
{
|
||||||
|
return ObjectStorage.SaveAsync(new ObjectStorageSaveArgs
|
||||||
|
{
|
||||||
|
ObjectKey = objectKey,
|
||||||
|
Content = content,
|
||||||
|
Overwrite = true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 序列化为历史字段名 Key / TempUrl,供出参映射读取。
|
||||||
|
/// </summary>
|
||||||
|
private static string SerializeObjectStorageResult(ObjectStorageSaveResult result)
|
||||||
|
{
|
||||||
|
return JsonConvert.SerializeObject(new
|
||||||
|
{
|
||||||
|
Key = result.ObjectKey,
|
||||||
|
TempUrl = result.Url,
|
||||||
|
IsSuccess = true
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<Import Project="../../common.props"/>
|
<Import Project="../../common.props" />
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
@ -8,20 +8,20 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\InterfaceForward.Application.Contracts\InterfaceForward.Application.Contracts.csproj"/>
|
<ProjectReference Include="..\InterfaceForward.Application.Contracts\InterfaceForward.Application.Contracts.csproj" />
|
||||||
<ProjectReference Include="..\InterfaceForward.Domain.Shared\InterfaceForward.Domain.Shared.csproj"/>
|
<ProjectReference Include="..\InterfaceForward.Domain.Shared\InterfaceForward.Domain.Shared.csproj" />
|
||||||
<ProjectReference Include="..\InterfaceForward.Repositories\InterfaceForward.Repositories.csproj"/>
|
<ProjectReference Include="..\InterfaceForward.Repositories\InterfaceForward.Repositories.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DiffPlex" Version="1.9.0" />
|
<PackageReference Include="DiffPlex" Version="1.9.0" />
|
||||||
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
|
|
||||||
<PackageReference Include="DotNetCore.Compile.Environment" Version="3.2.0" />
|
<PackageReference Include="DotNetCore.Compile.Environment" Version="3.2.0" />
|
||||||
<PackageReference Include="DotNetCore.Natasha.CSharp.Compiler" Version="8.0.0" />
|
<PackageReference Include="DotNetCore.Natasha.CSharp.Compiler" Version="8.0.0" />
|
||||||
<PackageReference Include="DotNetCore.Natasha.CSharp.Compiler.Domain" Version="8.0.0" />
|
<PackageReference Include="DotNetCore.Natasha.CSharp.Compiler.Domain" Version="8.0.0" />
|
||||||
<PackageReference Include="Fake.AspNetCore" Version="$(FakePackageVersion)" />
|
<PackageReference Include="Fake.AspNetCore" Version="$(FakePackageVersion)" />
|
||||||
<PackageReference Include="Fake.EventBus.RabbitMQ" Version="$(FakePackageVersion)" />
|
<PackageReference Include="Fake.EventBus.RabbitMQ" Version="$(FakePackageVersion)" />
|
||||||
<PackageReference Include="Fake.ObjectMapping.AutoMapper" Version="$(FakePackageVersion)" />
|
<PackageReference Include="Fake.ObjectMapping.AutoMapper" Version="$(FakePackageVersion)" />
|
||||||
|
<PackageReference Include="Fake.ObjectStorage.TencentCos" Version="$(FakePackageVersion)" />
|
||||||
<PackageReference Include="FreeRedis" Version="1.5.5" />
|
<PackageReference Include="FreeRedis" Version="1.5.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ using Fake.AspNetCore;
|
|||||||
using Fake.EventBus.RabbitMQ;
|
using Fake.EventBus.RabbitMQ;
|
||||||
using Fake.Modularity;
|
using Fake.Modularity;
|
||||||
using Fake.ObjectMapping.AutoMapper;
|
using Fake.ObjectMapping.AutoMapper;
|
||||||
|
using Fake.ObjectStorage;
|
||||||
using Fake.RabbitMQ;
|
using Fake.RabbitMQ;
|
||||||
using FreeRedis;
|
using FreeRedis;
|
||||||
using InterfaceForward.Application.Contracts;
|
using InterfaceForward.Application.Contracts;
|
||||||
@ -21,6 +22,7 @@ namespace InterfaceForward.Application;
|
|||||||
[DependsOn(typeof(FakeAspNetCoreModule))]
|
[DependsOn(typeof(FakeAspNetCoreModule))]
|
||||||
[DependsOn(typeof(FakeObjectMappingAutoMapperModule))]
|
[DependsOn(typeof(FakeObjectMappingAutoMapperModule))]
|
||||||
[DependsOn(typeof(FakeEventBusRabbitMqModule))]
|
[DependsOn(typeof(FakeEventBusRabbitMqModule))]
|
||||||
|
[DependsOn(typeof(FakeObjectStorageTencentCosModule))]
|
||||||
[DependsOn(typeof(InterfaceForwardRepositoriesModule))]
|
[DependsOn(typeof(InterfaceForwardRepositoriesModule))]
|
||||||
[DependsOn(typeof(InterfaceForwardDomainSharedModule))]
|
[DependsOn(typeof(InterfaceForwardDomainSharedModule))]
|
||||||
public class InterfaceForwardApplicationModule:FakeModule
|
public class InterfaceForwardApplicationModule:FakeModule
|
||||||
|
|||||||
@ -1,263 +0,0 @@
|
|||||||
using System.Security.Cryptography;
|
|
||||||
using Aliyun.OSS;
|
|
||||||
|
|
||||||
namespace InterfaceForward.Application.OSS
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 阿里云OSS帮助类
|
|
||||||
/// </summary>
|
|
||||||
public static class OSSHelper
|
|
||||||
{
|
|
||||||
#region 初始化
|
|
||||||
private static OSSOptions _OSSOptions;
|
|
||||||
internal static void Init(OSSOptions OSSOptions)
|
|
||||||
{
|
|
||||||
_OSSOptions = OSSOptions;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 获取client
|
|
||||||
private static OssClient GetClient()
|
|
||||||
{
|
|
||||||
string errorMessage = null;
|
|
||||||
if (string.IsNullOrEmpty(_OSSOptions?.Endpoint))
|
|
||||||
{
|
|
||||||
errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.Endpoint)}】!";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(_OSSOptions?.AccessKeyId))
|
|
||||||
{
|
|
||||||
errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.AccessKeyId)}】!";
|
|
||||||
}
|
|
||||||
if (string.IsNullOrEmpty(_OSSOptions?.AccessKeySecret))
|
|
||||||
{
|
|
||||||
errorMessage += $"未找到核心配置参数【{nameof(_OSSOptions.AccessKeySecret)}】!";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(errorMessage))
|
|
||||||
{
|
|
||||||
throw new Exception(errorMessage);
|
|
||||||
}
|
|
||||||
var client = new OssClient(_OSSOptions.Endpoint, _OSSOptions.AccessKeyId, _OSSOptions.AccessKeySecret);
|
|
||||||
return client;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 上传
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 上传文件
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="data">文档流</param>
|
|
||||||
/// <param name="fileName">文件名称</param>
|
|
||||||
/// <param name="usCustomKey">是否使用自定义ossKey,如果为true,会以fileName为key</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static UploadResultDto Upload(Stream data, string fileName = "", bool usCustomKey = false, bool isPublicBucket = false)
|
|
||||||
{
|
|
||||||
if (data == null || data.Length == 0)
|
|
||||||
return new UploadResultDto(false);
|
|
||||||
|
|
||||||
var result = Private_Upload(fileName, data, usCustomKey, isPublicBucket);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static UploadResultDto Private_Upload(string fileName, Stream data, bool usCustomKey = false, bool isPublicBucket = false)
|
|
||||||
{
|
|
||||||
var client = GetClient();
|
|
||||||
|
|
||||||
var ossKey = "";
|
|
||||||
if (usCustomKey)
|
|
||||||
{
|
|
||||||
ossKey = fileName;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var md5 = ComputeDataMd5(data).ToUpper();// 计算文件MD5值
|
|
||||||
var ext = Path.GetExtension(fileName);
|
|
||||||
ossKey = $"{md5}{ext}";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 文件已经存在直接返回
|
|
||||||
var existingObject = client.DoesObjectExist(_OSSOptions.BucketName, ossKey);
|
|
||||||
if (existingObject)
|
|
||||||
{
|
|
||||||
var res = new UploadResultDto(true);
|
|
||||||
res.TempUrl = ossKey.GetUrlByKey(isPublicBucket);
|
|
||||||
res.Key = ossKey;
|
|
||||||
res.FileName = fileName;
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上传文件
|
|
||||||
bool putResult = false;
|
|
||||||
|
|
||||||
using (var pubObj = client.PutObject(_OSSOptions.BucketName, ossKey, data))
|
|
||||||
{
|
|
||||||
putResult = pubObj.HttpStatusCode == System.Net.HttpStatusCode.OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (putResult)//上传成功
|
|
||||||
{
|
|
||||||
var result = new UploadResultDto(true);
|
|
||||||
result.FileName = fileName;
|
|
||||||
result.TempUrl = ossKey.GetUrlByKey(isPublicBucket);
|
|
||||||
result.Key = ossKey;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 上传失败
|
|
||||||
var result = new UploadResultDto(false);
|
|
||||||
result.FileName = fileName;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public static string ComputeDataMd5(Stream data)
|
|
||||||
{
|
|
||||||
using (var md5 = MD5.Create())
|
|
||||||
{
|
|
||||||
var hash = BitConverter.ToString(md5.ComputeHash(data)).Replace("-", "").Replace("=", "").ToLower();
|
|
||||||
data.Position = 0;
|
|
||||||
return hash;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 下载
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 通过Key获取文件的URL - 同步
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Key</param>
|
|
||||||
/// <returns>下载Url</returns>
|
|
||||||
public static string GetUrlByKey(this string key, bool isPublicBucket = false)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(key))
|
|
||||||
{
|
|
||||||
throw new Exception($"指定的key不能为空");
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var client = GetClient();
|
|
||||||
Uri url = client.GeneratePresignedUri(_OSSOptions.BucketName, key);
|
|
||||||
|
|
||||||
if (isPublicBucket)
|
|
||||||
{
|
|
||||||
var urlStr = url?.GetLeftPart(UriPartial.Path);
|
|
||||||
return (_OSSOptions.ReturnHttpsUrl && urlStr?.ToString()?.StartsWith("http://") == true) ? "https://" + urlStr.ToString().Substring(7) : urlStr.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return (_OSSOptions.ReturnHttpsUrl && url?.ToString()?.StartsWith("http://") == true) ? "https://" + url.ToString().Substring(7) : url.ToString();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new Exception(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 根据一组key返回url
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="keys"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
/// <exception cref="Exception"></exception>
|
|
||||||
public static Dictionary<string, string> GetUrlByKeys(params string[] keys)
|
|
||||||
{
|
|
||||||
var resDic = new Dictionary<string, string>();
|
|
||||||
if (keys == null || keys.Count() <= 0)
|
|
||||||
return resDic;
|
|
||||||
|
|
||||||
|
|
||||||
var returnHttps = _OSSOptions.ReturnHttpsUrl;
|
|
||||||
var client = GetClient();
|
|
||||||
|
|
||||||
foreach (var item in keys)
|
|
||||||
{
|
|
||||||
if (resDic.ContainsKey(item))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
Uri url = client.GeneratePresignedUri(_OSSOptions.BucketName, item);
|
|
||||||
if (url == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
resDic.Add(item, returnHttps ? url.ToString().Replace("http", "https") : url.ToString());
|
|
||||||
}
|
|
||||||
return resDic;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 通过Key获取文件流
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Key</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static Stream GetStreamByKey(this string key)
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(key))
|
|
||||||
{
|
|
||||||
throw new Exception($"指定的key不能为空");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var client = GetClient();
|
|
||||||
var obj = client.GetObject(_OSSOptions.BucketName, key);
|
|
||||||
if (obj != null)
|
|
||||||
{
|
|
||||||
return obj.Content;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception($"文件获取异常");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new Exception(ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 删除
|
|
||||||
/// <summary>
|
|
||||||
/// 删除文件
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="keys"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static DeleteObjectsResult DeleteObjectsByKeys(params string[] keys)
|
|
||||||
{
|
|
||||||
if (keys == null || keys.Length <= 0)
|
|
||||||
return default(DeleteObjectsResult);
|
|
||||||
|
|
||||||
var client = GetClient();
|
|
||||||
var request = new DeleteObjectsRequest(_OSSOptions.BucketName, keys);
|
|
||||||
|
|
||||||
return client.DeleteObjects(request);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 查看数据信息
|
|
||||||
/// <summary>
|
|
||||||
/// 查看文档信息
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ossKey"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static ObjectMetadata GetObjectMetadata(string ossKey)
|
|
||||||
{
|
|
||||||
var client = GetClient().GetObjectMetadata(_OSSOptions.BucketName, ossKey);
|
|
||||||
return client;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,32 +0,0 @@
|
|||||||
namespace InterfaceForward.Application.OSS;
|
|
||||||
|
|
||||||
public class OSSOptions
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 秘钥Id(类似于公钥)
|
|
||||||
/// </summary>
|
|
||||||
public string AccessKeyId { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 访问秘钥
|
|
||||||
/// </summary>
|
|
||||||
public string AccessKeySecret { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// OSS端点
|
|
||||||
/// </summary>
|
|
||||||
public string Endpoint { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 存储空间名称
|
|
||||||
/// 注意,如果有多个BucketName的话,可以直接使用代码的方式设置这个值
|
|
||||||
/// </summary>
|
|
||||||
public string BucketName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 返回https的url,默认false返回http
|
|
||||||
/// 阿里OSS默认支持http,https,不需要额外配置
|
|
||||||
/// </summary>
|
|
||||||
public bool ReturnHttpsUrl { get; set; }
|
|
||||||
}
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
namespace InterfaceForward.Application.OSS;
|
|
||||||
|
|
||||||
public class UploadResultDto
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 标识本次操作是否成功
|
|
||||||
/// </summary>
|
|
||||||
public bool IsSuccess { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 临时URL,过期时间15min
|
|
||||||
/// </summary>
|
|
||||||
public string TempUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 文件唯一标识Key,通常保存在数据
|
|
||||||
/// 后期所有的文件操作都是通过这个Key
|
|
||||||
/// </summary>
|
|
||||||
public string Key { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 文件原始名称
|
|
||||||
/// </summary>
|
|
||||||
public string FileName { get; set; }
|
|
||||||
|
|
||||||
public UploadResultDto(bool isSuccess)
|
|
||||||
{
|
|
||||||
IsSuccess = isSuccess;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,9 +1,9 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Fake.ObjectStorage;
|
||||||
using Fake.UnitOfWork;
|
using Fake.UnitOfWork;
|
||||||
using InterfaceForward.Application.Contracts.Dtos.App;
|
using InterfaceForward.Application.Contracts.Dtos.App;
|
||||||
using InterfaceForward.Application.Helpers;
|
using InterfaceForward.Application.Helpers;
|
||||||
using InterfaceForward.Application.OSS;
|
|
||||||
using InterfaceForward.Repositories;
|
using InterfaceForward.Repositories;
|
||||||
using InterfaceForward.Repositories.App.Entitys;
|
using InterfaceForward.Repositories.App.Entitys;
|
||||||
using InterfaceForward.Repositories.App.Services;
|
using InterfaceForward.Repositories.App.Services;
|
||||||
@ -24,6 +24,7 @@ public class AppsService : ApplicationService
|
|||||||
private readonly IAppRepository _appRepository;
|
private readonly IAppRepository _appRepository;
|
||||||
private readonly IAppScopeRepository _appScopeRepository;
|
private readonly IAppScopeRepository _appScopeRepository;
|
||||||
private readonly IBasicRepository<InterfaceEntity> _interfaceRepository;
|
private readonly IBasicRepository<InterfaceEntity> _interfaceRepository;
|
||||||
|
private readonly IObjectStorage _objectStorage;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
@ -31,11 +32,13 @@ public class AppsService : ApplicationService
|
|||||||
public AppsService(
|
public AppsService(
|
||||||
IAppRepository appRepository
|
IAppRepository appRepository
|
||||||
, IAppScopeRepository appScopeRepository
|
, IAppScopeRepository appScopeRepository
|
||||||
, IBasicRepository<InterfaceEntity> interfaceRepository)
|
, IBasicRepository<InterfaceEntity> interfaceRepository
|
||||||
|
, IObjectStorage objectStorage)
|
||||||
{
|
{
|
||||||
_appRepository = appRepository;
|
_appRepository = appRepository;
|
||||||
_appScopeRepository = appScopeRepository;
|
_appScopeRepository = appScopeRepository;
|
||||||
_interfaceRepository = interfaceRepository;
|
_interfaceRepository = interfaceRepository;
|
||||||
|
_objectStorage = objectStorage;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Get
|
#region Get
|
||||||
@ -53,13 +56,26 @@ public class AppsService : ApplicationService
|
|||||||
.OrderByDescending(a => a.UpdateTime)
|
.OrderByDescending(a => a.UpdateTime)
|
||||||
.ToPagedListAsync(input.PageIndex, input.PageSize);
|
.ToPagedListAsync(input.PageIndex, input.PageSize);
|
||||||
|
|
||||||
// var logoKeys = res.Items
|
var logoKeys = res.Items
|
||||||
// .Where(x => !x.LogoKey.IsNullOrWhiteSpace())
|
.Where(x => !x.LogoKey.IsNullOrWhiteSpace())
|
||||||
// .Select(x => x.LogoKey).ToArray();
|
.Select(x => x.LogoKey)
|
||||||
// var urlDic = OSSHelper.GetUrlByKeys(logoKeys);
|
.Distinct()
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
// foreach (var url in urlDic)
|
if (logoKeys.Length > 0)
|
||||||
// res.Items.First(x => x.LogoKey == url.Key).LogoUrl = url.Value;
|
{
|
||||||
|
var urlDic = new Dictionary<string, string>();
|
||||||
|
foreach (var logoKey in logoKeys)
|
||||||
|
{
|
||||||
|
urlDic[logoKey] = await _objectStorage.GetUrlAsync(logoKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in res.Items.Where(x => !x.LogoKey.IsNullOrWhiteSpace()))
|
||||||
|
{
|
||||||
|
if (urlDic.TryGetValue(item.LogoKey, out var logoUrl))
|
||||||
|
item.LogoUrl = logoUrl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -135,7 +151,9 @@ public class AppsService : ApplicationService
|
|||||||
.SingleAsync(x => x.Id == id);
|
.SingleAsync(x => x.Id == id);
|
||||||
_ = res ?? throw new BusinessException("在指定的编号下找不到数据");
|
_ = res ?? throw new BusinessException("在指定的编号下找不到数据");
|
||||||
|
|
||||||
// if (res.LogoKey != null) res.LogoUrl = OSSHelper.GetUrlByKey(res.LogoKey);
|
if (!res.LogoKey.IsNullOrWhiteSpace())
|
||||||
|
res.LogoUrl = await _objectStorage.GetUrlAsync(res.LogoKey);
|
||||||
|
|
||||||
res.AppScope = await _appScopeRepository.AsQueryable()
|
res.AppScope = await _appScopeRepository.AsQueryable()
|
||||||
.Where(x => x.AppId == id)
|
.Where(x => x.AppId == id)
|
||||||
.Select(x => new AppScopeOutput { Id = x.Id.SelectAll() })
|
.Select(x => new AppScopeOutput { Id = x.Id.SelectAll() })
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user