Browse Source

fix(oss): fixed overflow of memory stream length during large file transfer

pull/488/head
cKey 4 years ago
parent
commit
607f509e5f
  1. 5
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs
  2. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj
  3. 24
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp/LINGYUN/Abp/OssManagement/FileSystem/ImageSharp/ImageSharpFileSystemOssObjectProcesser.cs
  4. 40
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs

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

@ -228,10 +228,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
if (aliyunOssObject.IsSetResponseStream()) if (aliyunOssObject.IsSetResponseStream())
{ {
var memoryStream = new MemoryStream(); ossObject.SetContent(aliyunOssObject.Content);
await aliyunOssObject.Content.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
ossObject.SetContent(memoryStream);
} }
return ossObject; return ossObject;

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" /> <Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" /> <Import Project="..\..\..\common.props" />
@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta11" /> <PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta14" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

24
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem.ImageSharp/LINGYUN/Abp/OssManagement/FileSystem/ImageSharp/ImageSharpFileSystemOssObjectProcesser.cs

@ -24,21 +24,25 @@ namespace LINGYUN.Abp.OssManagement.FileSystem.ImageSharp
public virtual async Task ProcessAsync(FileSystemOssObjectContext context) public virtual async Task ProcessAsync(FileSystemOssObjectContext context)
{ {
var bytes = await context.OssObject.Content.GetAllBytesAsync(); var copyStream = context.OssObject.Content;
var bytes = await copyStream.GetAllBytesAsync();
if (IsImage(bytes))
{ if (IsImage(bytes))
var args = context.Process.Split(','); {
if (DrawGraphics(bytes, args, out Stream content)) var args = context.Process.Split(',');
{ if (DrawGraphics(bytes, args, out var content))
context.SetContent(content); {
} context.SetContent(content);
// 释放原图形流数据
await copyStream.DisposeAsync();
}
} }
} }
protected virtual bool DrawGraphics(byte[] fileBytes, string[] args, out Stream content) protected virtual bool DrawGraphics(byte[] fileBytes, string[] args, out Stream content)
{ {
using var image = Image.Load(fileBytes, out IImageFormat format); using var image = Image.Load(fileBytes, out var format);
// 大小 // 大小
var width = GetInt32Prarm(args, "w_"); var width = GetInt32Prarm(args, "w_");

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

@ -293,9 +293,8 @@ namespace LINGYUN.Abp.OssManagement.FileSystem
else else
{ {
var fileInfo = new FileInfo(filePath); var fileInfo = new FileInfo(filePath);
using (var fileStream = File.OpenRead(filePath)) var fileStream = File.OpenRead(filePath);
{ var ossObject = new OssObject(
var ossObject = new OssObject(
fileInfo.Name, fileInfo.Name,
objectPath, objectPath,
request.MD5 ? fileStream.MD5() : "", request.MD5 ? fileStream.MD5() : "",
@ -307,32 +306,29 @@ 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, "")
}; };
var memoryStream = new MemoryStream(); ossObject.SetContent(fileStream);
await fileStream.CopyToAsync(memoryStream);
ossObject.SetContent(memoryStream);
if (!request.Process.IsNullOrWhiteSpace()) if (!request.Process.IsNullOrWhiteSpace())
{
using var serviceScope = ServiceProvider.CreateScope();
var context = new FileSystemOssObjectContext(request.Process, ossObject, serviceScope.ServiceProvider);
foreach (var processer in Options.Processers)
{ {
using var serviceScope = ServiceProvider.CreateScope(); await processer.ProcessAsync(context);
var context = new FileSystemOssObjectContext(request.Process, ossObject, serviceScope.ServiceProvider);
foreach (var processer in Options.Processers)
{
await processer.ProcessAsync(context);
if (context.Handled) if (context.Handled)
{ {
ossObject.SetContent(context.Content); ossObject.SetContent(context.Content);
break; break;
}
} }
} }
return ossObject;
} }
return ossObject;
} }
} }

Loading…
Cancel
Save