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. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectInput.cs
  3. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/GetOssObjectsInput.cs
  4. 1
      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. 5
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs
  9. 1
      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. 3
      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,

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

@ -11,5 +11,6 @@ namespace LINGYUN.Abp.OssManagement
[Required] [Required]
public string Object { get; set; } public string Object { get; set; }
public bool MD5 { get; set; }
} }
} }

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

@ -9,5 +9,6 @@ namespace LINGYUN.Abp.OssManagement
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; }
} }
} }

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

@ -9,6 +9,7 @@ namespace LINGYUN.Abp.OssManagement
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 string MD5 { get; set; }
public DateTime? CreationDate { get; set; } public DateTime? CreationDate { get; set; }
public DateTime? LastModifiedDate { get; set; } public DateTime? LastModifiedDate { get; set; }
public IDictionary<string, string> Metadata { 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);
} }

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

@ -28,7 +28,10 @@ namespace LINGYUN.Abp.OssManagement
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))
{
MD5 = true,
};
var ossContainer = OssContainerFactory.Create(); var ossContainer = OssContainerFactory.Create();
var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest); var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest);

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

@ -8,6 +8,7 @@ namespace LINGYUN.Abp.OssManagement
public string Bucket { get; } public string Bucket { get; }
public string Path { get; } public string Path { get; }
public string Object { get; } public string Object { get; }
public bool MD5 { get; set; }
/// <summary> /// <summary>
/// 需要处理文件的参数 /// 需要处理文件的参数
/// </summary> /// </summary>

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,
});
} }
} }
} }

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

@ -15,6 +15,7 @@ namespace LINGYUN.Abp.OssManagement
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 string MD5{ get; }
public long Size { get; } public long Size { get; }
public Stream Content => _content; public Stream Content => _content;
public DateTime? CreationDate { get; } public DateTime? CreationDate { get; }
@ -23,6 +24,7 @@ namespace LINGYUN.Abp.OssManagement
public OssObject( public OssObject(
string name, string name,
string prefix, string prefix,
string md5,
DateTime? creationDate = null, DateTime? creationDate = null,
long size = 0, long size = 0,
DateTime? lastModifiedDate = null, DateTime? lastModifiedDate = null,
@ -31,6 +33,7 @@ namespace LINGYUN.Abp.OssManagement
{ {
Name = name; Name = name;
Prefix = prefix; Prefix = prefix;
MD5 = md5;
CreationDate = creationDate; CreationDate = creationDate;
LastModifiedDate = lastModifiedDate; LastModifiedDate = lastModifiedDate;
Size = size; Size = size;

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