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,
objectPath,
aliyunObject.ETag,
DateTime.Now,
aliyunObject.ContentLength,
DateTime.Now,
@ -215,6 +216,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
? aliyunOssObject.Key.Replace(objectPath, "")
: aliyunOssObject.Key,
request.Path,
aliyunOssObject.Metadata.ETag,
aliyunOssObject.Metadata.LastModified,
aliyunOssObject.Metadata.ContentLength,
aliyunOssObject.Metadata.LastModified,
@ -295,6 +297,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
? x.Key.Replace(objectPath, "")
: x.Key, // 去除目录名称
request.Prefix,
x.ETag,
x.LastModified,
x.Size,
x.LastModified,
@ -316,6 +319,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
.Select(x => new OssObject(
x.Replace(objectPath, ""),
request.Prefix,
"",
null,
0L,
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;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectInput
{
[Required]
public string Bucket { get; set; }
public string Path { get; set; }
[Required]
public string Object { get; set; }
}
}
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectInput
{
[Required]
public string Bucket { get; set; }
public string Path { get; set; }
[Required]
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;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectsInput : PagedAndSortedResultRequestDto
{
public string Bucket { get; set; }
public string Prefix { get; set; }
public string Delimiter { get; set; }
public string Marker { get; set; }
public string EncodingType { get; set; }
}
}
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectsInput : PagedAndSortedResultRequestDto
{
public string Bucket { get; set; }
public string Prefix { get; set; }
public string Delimiter { get; set; }
public string Marker { 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.Collections.Generic;
namespace LINGYUN.Abp.OssManagement
{
public class OssObjectDto
{
public bool IsFolder { get; set; }
public string Path { get; set; }
public string Name { get; set; }
public long Size { get; set; }
public DateTime? CreationDate { get; set; }
public DateTime? LastModifiedDate { get; set; }
public IDictionary<string, string> Metadata { get; set; }
}
}
using System;
using System.Collections.Generic;
namespace LINGYUN.Abp.OssManagement
{
public class OssObjectDto
{
public bool IsFolder { get; set; }
public string Path { get; set; }
public string Name { get; set; }
public long Size { get; set; }
public string MD5 { get; set; }
public DateTime? CreationDate { 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),
GetCurrentPath(HttpUtility.UrlDecode(input.Path)),
HttpUtility.UrlDecode(input.Process));
HttpUtility.UrlDecode(input.Process))
{
MD5 = true,
};
var ossContainer = _ossContainerFactory.Create();
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(
input.Bucket, input.Prefix, input.Marker,
input.Delimiter, input.EncodingType,
input.Delimiter, input.EncodingType, input.MD5,
input.SkipCount, input.MaxResultCount);
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 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);
}

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.OssManagement.Features;
using System.IO;
using System.Threading.Tasks;
using System.Web;
using Volo.Abp.Features;
namespace LINGYUN.Abp.OssManagement
{
public class StaticFilesAppService : OssManagementApplicationServiceBase, IStaticFilesAppService
{
protected IOssContainerFactory OssContainerFactory { get; }
public StaticFilesAppService(
IOssContainerFactory ossContainerFactory)
{
OssContainerFactory = ossContainerFactory;
}
[RequiresFeature(AbpOssManagementFeatureNames.OssObject.DownloadFile)]
[RequiresLimitFeature(
AbpOssManagementFeatureNames.OssObject.DownloadLimit,
AbpOssManagementFeatureNames.OssObject.DownloadInterval,
LimitPolicy.Month)]
public virtual async Task<Stream> GetAsync(GetStaticFileInput input)
{
var ossObjectRequest = new GetOssObjectRequest(
HttpUtility.UrlDecode(input.Bucket), // 需要处理特殊字符
HttpUtility.UrlDecode(input.Name),
HttpUtility.UrlDecode(input.Path),
HttpUtility.UrlDecode(input.Process));
var ossContainer = OssContainerFactory.Create();
var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest);
return ossObject.Content;
}
}
}
using LINGYUN.Abp.Features.LimitValidation;
using LINGYUN.Abp.OssManagement.Features;
using System.IO;
using System.Threading.Tasks;
using System.Web;
using Volo.Abp.Features;
namespace LINGYUN.Abp.OssManagement
{
public class StaticFilesAppService : OssManagementApplicationServiceBase, IStaticFilesAppService
{
protected IOssContainerFactory OssContainerFactory { get; }
public StaticFilesAppService(
IOssContainerFactory ossContainerFactory)
{
OssContainerFactory = ossContainerFactory;
}
[RequiresFeature(AbpOssManagementFeatureNames.OssObject.DownloadFile)]
[RequiresLimitFeature(
AbpOssManagementFeatureNames.OssObject.DownloadLimit,
AbpOssManagementFeatureNames.OssObject.DownloadInterval,
LimitPolicy.Month)]
public virtual async Task<Stream> GetAsync(GetStaticFileInput input)
{
var ossObjectRequest = new GetOssObjectRequest(
HttpUtility.UrlDecode(input.Bucket), // 需要处理特殊字符
HttpUtility.UrlDecode(input.Name),
HttpUtility.UrlDecode(input.Path),
HttpUtility.UrlDecode(input.Process))
{
MD5 = true,
};
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 Volo.Abp;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectRequest
{
public string Bucket { get; }
public string Path { get; }
public string Object { get; }
/// <summary>
/// 需要处理文件的参数
/// </summary>
public string Process { get; }
public GetOssObjectRequest(
[NotNull] string bucket,
[NotNull] string @object,
[CanBeNull] string path = "",
[CanBeNull] string process = "")
{
Check.NotNullOrWhiteSpace(bucket, nameof(bucket));
Check.NotNullOrWhiteSpace(@object, nameof(@object));
Bucket = bucket;
Object = @object;
Path = path;
Process = process;
}
}
}
using JetBrains.Annotations;
using Volo.Abp;
namespace LINGYUN.Abp.OssManagement
{
public class GetOssObjectRequest
{
public string Bucket { get; }
public string Path { get; }
public string Object { get; }
public bool MD5 { get; set; }
/// <summary>
/// 需要处理文件的参数
/// </summary>
public string Process { get; }
public GetOssObjectRequest(
[NotNull] string bucket,
[NotNull] string @object,
[CanBeNull] string path = "",
[CanBeNull] string process = "")
{
Check.NotNullOrWhiteSpace(bucket, nameof(bucket));
Check.NotNullOrWhiteSpace(@object, nameof(@object));
Bucket = bucket;
Object = @object;
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 int Current { get; }
public int? MaxKeys { get; }
public bool MD5 { get; set; }
public GetOssObjectsRequest(
[NotNull] string bucketName,
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,
string bucket,
string @object,
string path = "")
string path = "",
bool md5 = false)
{
return await ossContainer.GetObjectAsync(
new GetOssObjectRequest(bucket, @object, path));
new GetOssObjectRequest(bucket, @object, path)
{
MD5 = md5,
});
}
public static async Task<GetOssObjectsResponse> GetObjectsAsync(
@ -71,11 +75,15 @@ namespace LINGYUN.Abp.OssManagement
string marker = null,
string delimiter = null,
string encodingType = null,
bool md5 = false,
int skipCount = 0,
int maxResultCount = 10)
{
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.Collections.Generic;
using System.IO;
namespace LINGYUN.Abp.OssManagement
{
/// <summary>
/// 描述了一个对象的状态信息
/// </summary>
public class OssObject
{
private Stream _content;
public bool IsFolder { get; }
public string Name { get; }
public string FullName { get; set; }
public string Prefix { get; }
public long Size { get; }
public Stream Content => _content;
public DateTime? CreationDate { get; }
public DateTime? LastModifiedDate { get; }
public IDictionary<string, string> Metadata { get; }
public OssObject(
string name,
string prefix,
DateTime? creationDate = null,
long size = 0,
DateTime? lastModifiedDate = null,
IDictionary<string, string> metadata = null,
bool isFolder = false)
{
Name = name;
Prefix = prefix;
CreationDate = creationDate;
LastModifiedDate = lastModifiedDate;
Size = size;
IsFolder = isFolder;
Metadata = metadata ?? new Dictionary<string, string>();
}
public void SetContent(Stream stream)
{
_content = stream;
if (!_content.IsNullOrEmpty())
{
_content.Seek(0, SeekOrigin.Begin);
}
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
namespace LINGYUN.Abp.OssManagement
{
/// <summary>
/// 描述了一个对象的状态信息
/// </summary>
public class OssObject
{
private Stream _content;
public bool IsFolder { get; }
public string Name { get; }
public string FullName { get; set; }
public string Prefix { get; }
public string MD5{ get; }
public long Size { get; }
public Stream Content => _content;
public DateTime? CreationDate { get; }
public DateTime? LastModifiedDate { get; }
public IDictionary<string, string> Metadata { get; }
public OssObject(
string name,
string prefix,
string md5,
DateTime? creationDate = null,
long size = 0,
DateTime? lastModifiedDate = null,
IDictionary<string, string> metadata = null,
bool isFolder = false)
{
Name = name;
Prefix = prefix;
MD5 = md5;
CreationDate = creationDate;
LastModifiedDate = lastModifiedDate;
Size = size;
IsFolder = isFolder;
Metadata = metadata ?? new Dictionary<string, string>();
}
public void SetContent(Stream stream)
{
_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));
string fileMd5 = "";
FileMode fileMode = request.Overwrite ? FileMode.Create : FileMode.CreateNew;
using (var fileStream = File.Open(filePath, fileMode, FileAccess.ReadWrite))
{
await request.Content.CopyToAsync(fileStream);
fileMd5 = fileStream.MD5();
await fileStream.FlushAsync();
}
var fileInfo = new FileInfo(filePath);
var ossObject = new OssObject(
fileInfo.Name,
objectPath,
fileMd5,
fileInfo.CreationTime,
fileInfo.Length,
fileInfo.LastWriteTime,
@ -157,6 +162,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
var ossObject = new OssObject(
directoryInfo.Name.EnsureEndsWith('/'),
objectPath,
"",
directoryInfo.CreationTime,
0L,
directoryInfo.LastWriteTime,
@ -267,6 +273,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
var ossObject = new OssObject(
directoryInfo.Name.EnsureEndsWith('/'),
objectPath,
"",
directoryInfo.CreationTime,
0L,
directoryInfo.LastWriteTime,
@ -283,9 +290,12 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
else
{
var fileInfo = new FileInfo(filePath);
var ossObject = new OssObject(
using (var fileStream = File.OpenRead(filePath))
{
var ossObject = new OssObject(
fileInfo.Name,
objectPath,
request.MD5 ? fileStream.MD5() : "",
fileInfo.CreationTime,
fileInfo.Length,
fileInfo.LastWriteTime,
@ -294,11 +304,10 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
{ "IsReadOnly", fileInfo.IsReadOnly.ToString() },
{ "LastAccessTime", fileInfo.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss") }
})
{
FullName = fileInfo.FullName.Replace(Environment.ContentRootPath, "")
};
using (var fileStream = File.OpenRead(filePath))
{
{
FullName = fileInfo.FullName.Replace(Environment.ContentRootPath, "")
};
var memoryStream = new MemoryStream();
await fileStream.CopyToAsync(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(
(x is DirectoryInfo) ? x.Name.EnsureEndsWith('/') : x.Name,
request.Prefix,
request.MD5 ? (x as FileInfo)?.OpenRead().MD5() ?? "" : "",
x.CreationTime,
(x as FileInfo)?.Length ?? 0L,
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