UploadStream 3.1.1
dotnet add package UploadStream --version 3.1.1
NuGet\Install-Package UploadStream -Version 3.1.1
<PackageReference Include="UploadStream" Version="3.1.1" />
paket add UploadStream --version 3.1.1
#r "nuget: UploadStream, 3.1.1"
// Install UploadStream as a Cake Addin #addin nuget:?package=UploadStream&version=3.1.1 // Install UploadStream as a Cake Tool #tool nuget:?package=UploadStream&version=3.1.1
Optimise multi-part streaming file upload performance, offering 10x improvement in performance, and reduced memory allocation (10%-40%).
By default dotnet model form model binding loads the entire stream into memory using IFormFile
- this is non-ideal for large files
where processing of the stream should occur during streaming rather then buffering entire file(s) to memory/disk.
This package allows upload streams to be asynchronously processed via a delegate while maintaining generic model binding functionality with ModelState
validation.
Usage
[HttpPost("upload")]
public async Task<IActionResult> Upload() {
// returns a generic typed model, alternatively non-generic overload if no model binding is required
MyModel model = await this.StreamFiles<MyModel>(async formFile => {
// implement processing of stream as required via an IFormFile interface
using (var stream = formfile.OpenReadStream())
await ...
});
// ModelState is still validated from model
if(!ModelState.IsValid)
...
}
Results
Results are normalised in comparison to default dotnet IFormFile
model binding, the UploadStream
package offers around 10x performance
improvement and 10%-40% improvement in memory allocation.
Out of interest a comparison to file uploads via a base64 model was performed, interestingly this actually offers improved performance (1.5x - 2.5x) with a cost of increased memory allocations (0.3x - 0.1x) and increased memory heap trashing (gc gen1/gen2).
| Alias | File sizes | StreamFiles (us/alloc) | Base64 (us/alloc) |
|------ |-----------:|-----------------------:|------------------:|
| Xs | 5.94 KB | 1.14x / 1.23x | 1.16x / 1.44x |
| Sm | 106.53 KB | 3.98x / 1.43x | 2.85x / 0.30x |
| Md | 865.37 KB | 8.66x / 1.24x | 2.36x / 0.09x |
| Lg | 6.04 MB | 9.86x / 1.09x | 1.97x / 0.11x |
| Xl | 21.91 MB | 9.16x / 1.08x | 1.72x / 0.14x |
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.1 is compatible. |
-
.NETCoreApp 3.1
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.