diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs index 88becc522..d352ed143 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs +++ b/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, diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs index 7422bfba0..6d60f03eb 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs +++ b/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; } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs index 234ba3a9c..f46a6d7cf 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs +++ b/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; } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/OssObjectDto.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/OssObjectDto.cs index 80e41f896..9f03eb07f 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/OssObjectDto.cs +++ b/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 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 Metadata { get; set; } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs index 4c143df8f..a9186c891 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs +++ b/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); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs index c33c9c504..024a78951 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs +++ b/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(ossObjectResponse); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs index 024bd5a3c..7d1e93dc2 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs +++ b/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); } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs index 88062883d..de06e409f 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs +++ b/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 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 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; + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectRequest.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectRequest.cs index 6541d3bfd..aa47c39c5 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectRequest.cs +++ b/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; } - /// - /// 需要处理文件的参数 - /// - 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; } + /// + /// 需要处理文件的参数 + /// + 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; + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs index 8ca89466b..3e00c17d4 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs +++ b/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, diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs index f19702fc1..81ff77c67 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs +++ b/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 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, + }); } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs index 26a7f1fb0..d987f15cf 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs +++ b/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 -{ - /// - /// 描述了一个对象的状态信息 - /// - 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 Metadata { get; } - public OssObject( - string name, - string prefix, - DateTime? creationDate = null, - long size = 0, - DateTime? lastModifiedDate = null, - IDictionary metadata = null, - bool isFolder = false) - { - Name = name; - Prefix = prefix; - CreationDate = creationDate; - LastModifiedDate = lastModifiedDate; - Size = size; - IsFolder = isFolder; - Metadata = metadata ?? new Dictionary(); - } - - 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 +{ + /// + /// 描述了一个对象的状态信息 + /// + 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 Metadata { get; } + public OssObject( + string name, + string prefix, + string md5, + DateTime? creationDate = null, + long size = 0, + DateTime? lastModifiedDate = null, + IDictionary metadata = null, + bool isFolder = false) + { + Name = name; + Prefix = prefix; + MD5 = md5; + CreationDate = creationDate; + LastModifiedDate = lastModifiedDate; + Size = size; + IsFolder = isFolder; + Metadata = metadata ?? new Dictionary(); + } + + public void SetContent(Stream stream) + { + _content = stream; + if (!_content.IsNullOrEmpty()) + { + _content.Seek(0, SeekOrigin.Begin); + } + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs index b821c165f..9f2d06390 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs +++ b/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, diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/System/IO/FileSystemExtensions.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/System/IO/FileSystemExtensions.cs new file mode 100644 index 000000000..1363051c7 --- /dev/null +++ b/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(); + } + } +}