diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs index 2cc051ba62..8fe801b9d5 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ContentFormatters/AbpRemoteStreamContentModelBinder.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc.ModelBinding; @@ -99,6 +100,7 @@ public class AbpRemoteStreamContentModelBinder : IModelBin { var form = await request.ReadFormAsync(); + var useMemoryStream = form.Files.Count > 1; foreach (var file in form.Files) { // If there is an in the form and is left blank. @@ -109,13 +111,27 @@ public class AbpRemoteStreamContentModelBinder : IModelBin if (file.Name.Equals(modelName, StringComparison.OrdinalIgnoreCase)) { - postedFiles.Add(new RemoteStreamContent(file.OpenReadStream(), file.FileName, file.ContentType, file.Length).As()); + if (useMemoryStream) + { + var memoryStream = new MemoryStream(); + await file.OpenReadStream().CopyToAsync(memoryStream); + memoryStream.Position = 0; + postedFiles.Add(new RemoteStreamContent(memoryStream, file.FileName, file.ContentType, file.Length, disposeStream: false).As()); + bindingContext.HttpContext.Response.OnCompleted(async () => + { + await memoryStream.DisposeAsync(); + }); + } + else + { + postedFiles.Add(new RemoteStreamContent(file.OpenReadStream(), file.FileName, file.ContentType, file.Length, disposeStream: false).As()); + } } } } else if (bindingContext.IsTopLevelObject) { - postedFiles.Add(new RemoteStreamContent(request.Body, null, request.ContentType, request.ContentLength).As()); + postedFiles.Add(new RemoteStreamContent(request.Body, null, request.ContentType, request.ContentLength, disposeStream: false).As()); } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs index bc67fac38f..3d6fa77208 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/Content/RemoteStreamContent.cs @@ -17,7 +17,6 @@ public class RemoteStreamContent : IRemoteStreamContent public RemoteStreamContent(Stream stream, string? fileName = null, string? contentType = null, long? readOnlyLength = null, bool disposeStream = true) { _stream = stream; - FileName = fileName; if (contentType != null) { @@ -34,10 +33,16 @@ public class RemoteStreamContent : IRemoteStreamContent public virtual void Dispose() { - if (!_disposed && _disposeStream) + if (_disposed) { - _disposed = true; - _stream?.Dispose(); + return; } + + if (_disposeStream) + { + _stream.Dispose(); + } + + _disposed = true; } }