Browse Source

feat(oss): 增加MD5的支持

pull/396/head
cKey 4 years ago
parent
commit
a0e77ece8f
  1. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs
  2. 31
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs
  3. 27
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs
  4. 33
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/OssObjectDto.cs
  5. 5
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs
  6. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs
  7. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs
  8. 81
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs
  9. 63
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectRequest.cs
  10. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs
  11. 14
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs
  12. 103
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs
  13. 26
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs
  14. 25
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/System/IO/FileSystemExtensions.cs

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

@ -105,6 +105,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
? objectName.Replace(objectPath, "") ? objectName.Replace(objectPath, "")
: objectName, : objectName,
objectPath, objectPath,
aliyunObject.ETag,
DateTime.Now, DateTime.Now,
aliyunObject.ContentLength, aliyunObject.ContentLength,
DateTime.Now, DateTime.Now,
@ -215,6 +216,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
? aliyunOssObject.Key.Replace(objectPath, "") ? aliyunOssObject.Key.Replace(objectPath, "")
: aliyunOssObject.Key, : aliyunOssObject.Key,
request.Path, request.Path,
aliyunOssObject.Metadata.ETag,
aliyunOssObject.Metadata.LastModified, aliyunOssObject.Metadata.LastModified,
aliyunOssObject.Metadata.ContentLength, aliyunOssObject.Metadata.ContentLength,
aliyunOssObject.Metadata.LastModified, aliyunOssObject.Metadata.LastModified,
@ -295,6 +297,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
? x.Key.Replace(objectPath, "") ? x.Key.Replace(objectPath, "")
: x.Key, // 去除目录名称 : x.Key, // 去除目录名称
request.Prefix, request.Prefix,
x.ETag,
x.LastModified, x.LastModified,
x.Size, x.Size,
x.LastModified, x.LastModified,
@ -316,6 +319,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
.Select(x => new OssObject( .Select(x => new OssObject(
x.Replace(objectPath, ""), x.Replace(objectPath, ""),
request.Prefix, request.Prefix,
"",
null, null,
0L, 0L,
null, null,

31
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs

@ -1,15 +1,16 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class GetOssObjectInput public class GetOssObjectInput
{ {
[Required] [Required]
public string Bucket { get; set; } public string Bucket { get; set; }
public string Path { get; set; } public string Path { get; set; }
[Required] [Required]
public string Object { get; set; } public string Object { get; set; }
} public bool MD5 { get; set; }
} }
}

27
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs

@ -1,13 +1,14 @@
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class GetOssObjectsInput : PagedAndSortedResultRequestDto public class GetOssObjectsInput : PagedAndSortedResultRequestDto
{ {
public string Bucket { get; set; } public string Bucket { get; set; }
public string Prefix { get; set; } public string Prefix { get; set; }
public string Delimiter { get; set; } public string Delimiter { get; set; }
public string Marker { get; set; } public string Marker { get; set; }
public string EncodingType { get; set; } public string EncodingType { get; set; }
} public bool MD5 { get; set; }
} }
}

33
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/OssObjectDto.cs

@ -1,16 +1,17 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class OssObjectDto public class OssObjectDto
{ {
public bool IsFolder { get; set; } public bool IsFolder { get; set; }
public string Path { get; set; } public string Path { get; set; }
public string Name { get; set; } public string Name { get; set; }
public long Size { get; set; } public long Size { get; set; }
public DateTime? CreationDate { get; set; } public string MD5 { get; set; }
public DateTime? LastModifiedDate { get; set; } public DateTime? CreationDate { get; set; }
public IDictionary<string, string> Metadata { get; set; } public DateTime? LastModifiedDate { get; set; }
} public IDictionary<string, string> Metadata { get; set; }
} }
}

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

@ -83,7 +83,10 @@ namespace LINGYUN.Abp.OssManagement
// 需要处理特殊字符 // 需要处理特殊字符
HttpUtility.UrlDecode(input.Name), HttpUtility.UrlDecode(input.Name),
GetCurrentPath(HttpUtility.UrlDecode(input.Path)), GetCurrentPath(HttpUtility.UrlDecode(input.Path)),
HttpUtility.UrlDecode(input.Process)); HttpUtility.UrlDecode(input.Process))
{
MD5 = true,
};
var ossContainer = _ossContainerFactory.Create(); var ossContainer = _ossContainerFactory.Create();
var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest); var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest);

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

@ -56,7 +56,7 @@ namespace LINGYUN.Abp.OssManagement
var ossObjectResponse = await oss.GetObjectsAsync( var ossObjectResponse = await oss.GetObjectsAsync(
input.Bucket, input.Prefix, input.Marker, input.Bucket, input.Prefix, input.Marker,
input.Delimiter, input.EncodingType, input.Delimiter, input.EncodingType, input.MD5,
input.SkipCount, input.MaxResultCount); input.SkipCount, input.MaxResultCount);
return ObjectMapper.Map<GetOssObjectsResponse, OssObjectsResultDto>(ossObjectResponse); return ObjectMapper.Map<GetOssObjectsResponse, OssObjectsResultDto>(ossObjectResponse);

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

@ -64,7 +64,7 @@ namespace LINGYUN.Abp.OssManagement
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
var ossObject = await oss.GetObjectAsync(input.Bucket, input.Object, input.Path); var ossObject = await oss.GetObjectAsync(input.Bucket, input.Object, input.Path, input.MD5);
return ObjectMapper.Map<OssObject, OssObjectDto>(ossObject); return ObjectMapper.Map<OssObject, OssObjectDto>(ossObject);
} }

81
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs

@ -1,39 +1,42 @@
using LINGYUN.Abp.Features.LimitValidation; using LINGYUN.Abp.Features.LimitValidation;
using LINGYUN.Abp.OssManagement.Features; using LINGYUN.Abp.OssManagement.Features;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
using Volo.Abp.Features; using Volo.Abp.Features;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class StaticFilesAppService : OssManagementApplicationServiceBase, IStaticFilesAppService public class StaticFilesAppService : OssManagementApplicationServiceBase, IStaticFilesAppService
{ {
protected IOssContainerFactory OssContainerFactory { get; } protected IOssContainerFactory OssContainerFactory { get; }
public StaticFilesAppService( public StaticFilesAppService(
IOssContainerFactory ossContainerFactory) IOssContainerFactory ossContainerFactory)
{ {
OssContainerFactory = ossContainerFactory; OssContainerFactory = ossContainerFactory;
} }
[RequiresFeature(AbpOssManagementFeatureNames.OssObject.DownloadFile)] [RequiresFeature(AbpOssManagementFeatureNames.OssObject.DownloadFile)]
[RequiresLimitFeature( [RequiresLimitFeature(
AbpOssManagementFeatureNames.OssObject.DownloadLimit, AbpOssManagementFeatureNames.OssObject.DownloadLimit,
AbpOssManagementFeatureNames.OssObject.DownloadInterval, AbpOssManagementFeatureNames.OssObject.DownloadInterval,
LimitPolicy.Month)] LimitPolicy.Month)]
public virtual async Task<Stream> GetAsync(GetStaticFileInput input) public virtual async Task<Stream> GetAsync(GetStaticFileInput input)
{ {
var ossObjectRequest = new GetOssObjectRequest( var ossObjectRequest = new GetOssObjectRequest(
HttpUtility.UrlDecode(input.Bucket), // 需要处理特殊字符 HttpUtility.UrlDecode(input.Bucket), // 需要处理特殊字符
HttpUtility.UrlDecode(input.Name), HttpUtility.UrlDecode(input.Name),
HttpUtility.UrlDecode(input.Path), HttpUtility.UrlDecode(input.Path),
HttpUtility.UrlDecode(input.Process)); HttpUtility.UrlDecode(input.Process))
{
var ossContainer = OssContainerFactory.Create(); MD5 = true,
var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest); };
return ossObject.Content; var ossContainer = OssContainerFactory.Create();
} var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest);
}
} return ossObject.Content;
}
}
}

63
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectRequest.cs

@ -1,31 +1,32 @@
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp; using Volo.Abp;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class GetOssObjectRequest public class GetOssObjectRequest
{ {
public string Bucket { get; } public string Bucket { get; }
public string Path { get; } public string Path { get; }
public string Object { get; } public string Object { get; }
/// <summary> public bool MD5 { get; set; }
/// 需要处理文件的参数 /// <summary>
/// </summary> /// 需要处理文件的参数
public string Process { get; } /// </summary>
public string Process { get; }
public GetOssObjectRequest(
[NotNull] string bucket, public GetOssObjectRequest(
[NotNull] string @object, [NotNull] string bucket,
[CanBeNull] string path = "", [NotNull] string @object,
[CanBeNull] string process = "") [CanBeNull] string path = "",
{ [CanBeNull] string process = "")
Check.NotNullOrWhiteSpace(bucket, nameof(bucket)); {
Check.NotNullOrWhiteSpace(@object, nameof(@object)); Check.NotNullOrWhiteSpace(bucket, nameof(bucket));
Check.NotNullOrWhiteSpace(@object, nameof(@object));
Bucket = bucket;
Object = @object; Bucket = bucket;
Path = path; Object = @object;
Process = process; Path = path;
} Process = process;
} }
} }
}

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

@ -12,6 +12,7 @@ namespace LINGYUN.Abp.OssManagement
public string EncodingType { get; } public string EncodingType { get; }
public int Current { get; } public int Current { get; }
public int? MaxKeys { get; } public int? MaxKeys { get; }
public bool MD5 { get; set; }
public GetOssObjectsRequest( public GetOssObjectsRequest(
[NotNull] string bucketName, [NotNull] string bucketName,
string prefix = null, string prefix = null,

14
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs

@ -58,10 +58,14 @@ namespace LINGYUN.Abp.OssManagement
this IOssContainer ossContainer, this IOssContainer ossContainer,
string bucket, string bucket,
string @object, string @object,
string path = "") string path = "",
bool md5 = false)
{ {
return await ossContainer.GetObjectAsync( return await ossContainer.GetObjectAsync(
new GetOssObjectRequest(bucket, @object, path)); new GetOssObjectRequest(bucket, @object, path)
{
MD5 = md5,
});
} }
public static async Task<GetOssObjectsResponse> GetObjectsAsync( public static async Task<GetOssObjectsResponse> GetObjectsAsync(
@ -71,11 +75,15 @@ namespace LINGYUN.Abp.OssManagement
string marker = null, string marker = null,
string delimiter = null, string delimiter = null,
string encodingType = null, string encodingType = null,
bool md5 = false,
int skipCount = 0, int skipCount = 0,
int maxResultCount = 10) int maxResultCount = 10)
{ {
return await ossContainer.GetObjectsAsync( return await ossContainer.GetObjectsAsync(
new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, skipCount, maxResultCount)); new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, skipCount, maxResultCount)
{
MD5 = md5,
});
} }
} }
} }

103
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs

@ -1,50 +1,53 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
/// <summary> /// <summary>
/// 描述了一个对象的状态信息 /// 描述了一个对象的状态信息
/// </summary> /// </summary>
public class OssObject public class OssObject
{ {
private Stream _content; private Stream _content;
public bool IsFolder { get; } public bool IsFolder { get; }
public string Name { get; } public string Name { get; }
public string FullName { get; set; } public string FullName { get; set; }
public string Prefix { get; } public string Prefix { get; }
public long Size { get; } public string MD5{ get; }
public Stream Content => _content; public long Size { get; }
public DateTime? CreationDate { get; } public Stream Content => _content;
public DateTime? LastModifiedDate { get; } public DateTime? CreationDate { get; }
public IDictionary<string, string> Metadata { get; } public DateTime? LastModifiedDate { get; }
public OssObject( public IDictionary<string, string> Metadata { get; }
string name, public OssObject(
string prefix, string name,
DateTime? creationDate = null, string prefix,
long size = 0, string md5,
DateTime? lastModifiedDate = null, DateTime? creationDate = null,
IDictionary<string, string> metadata = null, long size = 0,
bool isFolder = false) DateTime? lastModifiedDate = null,
{ IDictionary<string, string> metadata = null,
Name = name; bool isFolder = false)
Prefix = prefix; {
CreationDate = creationDate; Name = name;
LastModifiedDate = lastModifiedDate; Prefix = prefix;
Size = size; MD5 = md5;
IsFolder = isFolder; CreationDate = creationDate;
Metadata = metadata ?? new Dictionary<string, string>(); LastModifiedDate = lastModifiedDate;
} Size = size;
IsFolder = isFolder;
public void SetContent(Stream stream) Metadata = metadata ?? new Dictionary<string, string>();
{ }
_content = stream;
if (!_content.IsNullOrEmpty()) public void SetContent(Stream stream)
{ {
_content.Seek(0, SeekOrigin.Begin); _content = stream;
} if (!_content.IsNullOrEmpty())
} {
} _content.Seek(0, SeekOrigin.Begin);
} }
}
}
}

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

@ -117,17 +117,22 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)); DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath));
string fileMd5 = "";
FileMode fileMode = request.Overwrite ? FileMode.Create : FileMode.CreateNew; FileMode fileMode = request.Overwrite ? FileMode.Create : FileMode.CreateNew;
using (var fileStream = File.Open(filePath, fileMode, FileAccess.ReadWrite)) using (var fileStream = File.Open(filePath, fileMode, FileAccess.ReadWrite))
{ {
await request.Content.CopyToAsync(fileStream); await request.Content.CopyToAsync(fileStream);
fileMd5 = fileStream.MD5();
await fileStream.FlushAsync(); await fileStream.FlushAsync();
} }
var fileInfo = new FileInfo(filePath); var fileInfo = new FileInfo(filePath);
var ossObject = new OssObject( var ossObject = new OssObject(
fileInfo.Name, fileInfo.Name,
objectPath, objectPath,
fileMd5,
fileInfo.CreationTime, fileInfo.CreationTime,
fileInfo.Length, fileInfo.Length,
fileInfo.LastWriteTime, fileInfo.LastWriteTime,
@ -157,6 +162,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
var ossObject = new OssObject( var ossObject = new OssObject(
directoryInfo.Name.EnsureEndsWith('/'), directoryInfo.Name.EnsureEndsWith('/'),
objectPath, objectPath,
"",
directoryInfo.CreationTime, directoryInfo.CreationTime,
0L, 0L,
directoryInfo.LastWriteTime, directoryInfo.LastWriteTime,
@ -267,6 +273,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
var ossObject = new OssObject( var ossObject = new OssObject(
directoryInfo.Name.EnsureEndsWith('/'), directoryInfo.Name.EnsureEndsWith('/'),
objectPath, objectPath,
"",
directoryInfo.CreationTime, directoryInfo.CreationTime,
0L, 0L,
directoryInfo.LastWriteTime, directoryInfo.LastWriteTime,
@ -283,9 +290,12 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
else else
{ {
var fileInfo = new FileInfo(filePath); var fileInfo = new FileInfo(filePath);
var ossObject = new OssObject( using (var fileStream = File.OpenRead(filePath))
{
var ossObject = new OssObject(
fileInfo.Name, fileInfo.Name,
objectPath, objectPath,
request.MD5 ? fileStream.MD5() : "",
fileInfo.CreationTime, fileInfo.CreationTime,
fileInfo.Length, fileInfo.Length,
fileInfo.LastWriteTime, fileInfo.LastWriteTime,
@ -294,11 +304,10 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
{ "IsReadOnly", fileInfo.IsReadOnly.ToString() }, { "IsReadOnly", fileInfo.IsReadOnly.ToString() },
{ "LastAccessTime", fileInfo.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss") } { "LastAccessTime", fileInfo.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss") }
}) })
{ {
FullName = fileInfo.FullName.Replace(Environment.ContentRootPath, "") FullName = fileInfo.FullName.Replace(Environment.ContentRootPath, "")
}; };
using (var fileStream = File.OpenRead(filePath))
{
var memoryStream = new MemoryStream(); var memoryStream = new MemoryStream();
await fileStream.CopyToAsync(memoryStream); await fileStream.CopyToAsync(memoryStream);
ossObject.SetContent(memoryStream); ossObject.SetContent(memoryStream);
@ -318,9 +327,9 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
} }
} }
} }
}
return ossObject; return ossObject;
}
} }
} }
@ -470,6 +479,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
fileSystems.Select(x => new OssObject( fileSystems.Select(x => new OssObject(
(x is DirectoryInfo) ? x.Name.EnsureEndsWith('/') : x.Name, (x is DirectoryInfo) ? x.Name.EnsureEndsWith('/') : x.Name,
request.Prefix, request.Prefix,
request.MD5 ? (x as FileInfo)?.OpenRead().MD5() ?? "" : "",
x.CreationTime, x.CreationTime,
(x as FileInfo)?.Length ?? 0L, (x as FileInfo)?.Length ?? 0L,
x.LastWriteTime, x.LastWriteTime,

25
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/System/IO/FileSystemExtensions.cs

@ -0,0 +1,25 @@
using System.Security.Cryptography;
using System.Text;
namespace System.IO
{
internal static class FileSystemExtensions
{
public static string MD5(this FileStream stream)
{
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
using MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(stream);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
stream.Seek(0, SeekOrigin.Begin);
return sb.ToString();
}
}
}
Loading…
Cancel
Save