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())
{
var memoryStream = new MemoryStream();
await aliyunOssObject.Content.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
ossObject.SetContent(memoryStream);
ossObject.SetContent(aliyunOssObject.Content);
}
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="..\..\..\common.props" />
@ -9,7 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta11" />
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta14" />
</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)
{
var bytes = await context.OssObject.Content.GetAllBytesAsync();
if (IsImage(bytes))
{
var args = context.Process.Split(',');
if (DrawGraphics(bytes, args, out Stream content))
{
context.SetContent(content);
}
var copyStream = context.OssObject.Content;
var bytes = await copyStream.GetAllBytesAsync();
if (IsImage(bytes))
{
var args = context.Process.Split(',');
if (DrawGraphics(bytes, args, out var content))
{
context.SetContent(content);
// 释放原图形流数据
await copyStream.DisposeAsync();
}
}
}
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_");

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
{
var fileInfo = new FileInfo(filePath);
using (var fileStream = File.OpenRead(filePath))
{
var ossObject = new OssObject(
var fileStream = File.OpenRead(filePath);
var ossObject = new OssObject(
fileInfo.Name,
objectPath,
request.MD5 ? fileStream.MD5() : "",
@ -307,32 +306,29 @@ 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, "")
};
{
FullName = fileInfo.FullName.Replace(Environment.ContentRootPath, "")
};
var memoryStream = new MemoryStream();
await fileStream.CopyToAsync(memoryStream);
ossObject.SetContent(memoryStream);
ossObject.SetContent(fileStream);
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();
var context = new FileSystemOssObjectContext(request.Process, ossObject, serviceScope.ServiceProvider);
foreach (var processer in Options.Processers)
{
await processer.ProcessAsync(context);
await processer.ProcessAsync(context);
if (context.Handled)
{
ossObject.SetContent(context.Content);
break;
}
if (context.Handled)
{
ossObject.SetContent(context.Content);
break;
}
}
return ossObject;
}
return ossObject;
}
}

Loading…
Cancel
Save