public async Task< IRemoteStreamContent > ExportAsync(ExportDto input)
{
var contents = new Dictionary<string, byte[]>();
var discardedContents = new Dictionary<string, byte[]>();
FillMuyCompressionItems(ref contents, ref discardedContents);
FillMlCompressionItems(ref contents, ref discardedContents);
FillAkbCompressionItems(ref contents, ref discardedContents);
FillCkCompressionItems(ref contents, ref discardedContents);
var zipFileName = "EXPORT.zip";
var mainZipFileStream = new FileStream(Path.Join(Path.GetTempPath(), zipFileName), FileMode.Create, FileAccess.ReadWrite);
using (var zipArchive = new ZipArchive(mainZipFileStream, ZipArchiveMode.Create, true))
{
for (var i = 0; i < contents.Count; i++)
{
var item = contents.ElementAt(i);
using var originalFileStream = new MemoryStream(item.Value);
var zipEntry = zipArchive.CreateEntry(item.Key, CompressionLevel.Fastest);
await using var zipEntryStream = zipEntry.Open();
await originalFileStream.CopyToAsync(zipEntryStream);
}
}
mainZipFileStream.Seek(0, SeekOrigin.Begin);
return new RemoteStreamContent(mainZipFileStream, zipFileName, FileTypes.Zip.ContentType);
}
public async Task< FileStreamResult > ExportAsync(ExportDto input)
{
var contents = new Dictionary<string, byte[]>();
var discardedContents = new Dictionary<string, byte[]>();
FillMuyCompressionItems(ref contents, ref discardedContents);
FillMlCompressionItems(ref contents, ref discardedContents);
FillAkbCompressionItems(ref contents, ref discardedContents);
FillCkCompressionItems(ref contents, ref discardedContents);
var zipFileName = "EXPORT.zip";
var mainZipFileStream = new FileStream(Path.Join(Path.GetTempPath(), zipFileName), FileMode.Create, FileAccess.ReadWrite);
using (var zipArchive = new ZipArchive(mainZipFileStream, ZipArchiveMode.Create, true))
{
for (var i = 0; i < contents.Count; i++)
{
var item = contents.ElementAt(i);
var originalFileStream = new FileStream(Path.Join(Path.GetTempPath(), item.Key), FileMode.Create, FileAccess.ReadWrite);
await originalFileStream.WriteAsync(item.Value);
originalFileStream.Seek(0, SeekOrigin.Begin);
var zipEntry = zipArchive.CreateEntry(item.Key, CompressionLevel.Fastest);
await using(var zipEntryStream = zipEntry.Open())
await using (originalFileStream)
{
await originalFileStream.CopyToAsync(zipEntryStream);
}
}
}
mainZipFileStream.Seek(0, SeekOrigin.Begin);
return new FileStreamResult(mainZipFileStream, FileTypes.Zip.ContentType);
}
Hello,
I have a big zip file in the server (5GB). I am trying to send the file to the front end so that the user can download it.
return new RemoteStreamContent(zipFileStream, zipFileName, FileTypes.Zip.ContentType);
This approach works for moderate files, however gives an error for big files.
2025-05-22 12:07:54.247 +03:00 [ERR] Stream was too long.
System.IO.IOException: Stream was too long.
at System.IO.MemoryStream.WriteAsync(ReadOnlyMemory`1 buffer, CancellationToken cancellationToken)
--- End of stack trace from previous location ---
at System.IO.Stream.<CopyToAsync>g__Core|27_0(Stream source, Stream destination, Int32 bufferSize, CancellationToken cancellationToken)
at System.IO.Strategies.BufferedFileStreamStrategy.CopyToAsyncCore(Stream destination, Int32 bufferSize, CancellationToken cancellationToken)
at Volo.Abp.AspNetCore.Mvc.ContentFormatters.RemoteStreamContentOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|28_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|7_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Volo.Abp.AspNetCore.Serilog.AbpSerilogMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Auditing.AbpAuditingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Volo.Abp.AspNetCore.Auditing.AbpAuditingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at IPS.IPSHttpApiHostModule.<>c.<<OnApplicationInitialization>b__12_0>d.MoveNext() in C:\eld-vm-01-b1\_work\27\s\src\IPS.HttpApi.Host\IPSHttpApiHostModule.cs:line 359
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Volo.Abp.AspNetCore.Security.Claims.AbpDynamicClaimsMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.Uow.AbpUnitOfWorkMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Volo.Abp.AspNetCore.ExceptionHandling.AbpExceptionHandlingMiddleware.InvokeAsync(HttpContext context, RequestDelegate next)
What should be the approach for big files?
Thank you.
Ok then thank you.
I'm not sure about angular. You can try to set IsVisibleToClients of IdentityProSettingNames.Session.PreventConcurrentLogin to fasle
Unfortunately, this does not work. Do you have any other suggestions or is it not provided in the framework?
Thanks for the reply. I have done what you have suggested and it works perfectly.

Hello,
With the version 8.2.0, you have provided the feature of changing the behavior for the concurrent login ("Disabled", "Logout from same type devices" and "Logout from all devices"). However, this option can be changed by each tenant admin under the settings menu.
How can I set the behavior for all the tenants as superadmin (admin without a tenant) and make sure that tenant admins cannot change it in any case?
Thank you.
Any updates on this topic?