HttpMultipartParser 8.1.0
See the version list below for details.
dotnet add package HttpMultipartParser --version 8.1.0
NuGet\Install-Package HttpMultipartParser -Version 8.1.0
<PackageReference Include="HttpMultipartParser" Version="8.1.0" />
<PackageVersion Include="HttpMultipartParser" Version="8.1.0" />
<PackageReference Include="HttpMultipartParser" />
paket add HttpMultipartParser --version 8.1.0
#r "nuget: HttpMultipartParser, 8.1.0"
#:package HttpMultipartParser@8.1.0
#addin nuget:?package=HttpMultipartParser&version=8.1.0
#tool nuget:?package=HttpMultipartParser&version=8.1.0
Http Multipart Parser
| Release Notes | NuGet (stable) | MyGet (prerelease) |
|---|---|---|
About
The Http Multipart Parser does it exactly what it claims on the tin: parses multipart/form-data. This particular parser is well suited to parsing large data from streams as it doesn't attempt to read the entire stream at once and procudes a set of streams for file data.
Installation
The easiest way to include HttpMultipartParser in your project is by adding the nuget package to your project:
PM> Install-Package HttpMultipartParser
.NET framework suport
- The parser was built for and tested on .NET 4.8, .NET standard 2.1, .NET 5.0 and .NET 6.0.
- Version 5.1.0 was the last version that supported .NET 4.6.1, NET 4.7.2 and .NET standard 2.0.
- Version 2.2.4 was the last version that supported older .NET platforms such as .NET 4.5 and .NET standard 1.3.
Usage
Non-Streaming (Simple, don't use on very large files)
- Parse the stream containing the multipart/form-data by invoking
MultipartFormDataParser.Parse(or it's asynchronous counterpartMultipartFormDataParser.ParseAsync). - Access the data through the parser.
Streaming (Handles large files)
- Create a new StreamingMultipartFormDataParser with the stream containing the multipart/form-data
- Set up the ParameterHandler and FileHandler delegates
- Call
parser.Run()(or it's asynchronous counterpartparser.RunAsync()) - The delegates will be called as data streams in.
Examples
Single file
// stream:
-----------------------------41952539122868
Content-Disposition: form-data; name="username"
example
-----------------------------41952539122868
Content-Disposition: form-data; name="email"
example@data.com
-----------------------------41952539122868
Content-Disposition: form-data; name="files[]"; filename="photo1.jpg"
Content-Type: image/jpeg
ExampleBinaryData012031203
-----------------------------41952539122868--
// ===== Simple Parsing ====
// You can parse synchronously:
var parser = MultipartFormDataParser.Parse(stream);
// Or you can parse asynchronously:
var parser = await MultipartFormDataParser.ParseAsync(stream).ConfigureAwait(false);
// From this point the data is parsed, we can retrieve the
// form data using the GetParameterValue method.
var username = parser.GetParameterValue("username");
var email = parser.GetParameterValue("email")
// Files are stored in a list:
var file = parser.Files.First();
string filename = file.FileName;
Stream data = file.Data;
// ==== Advanced Parsing ====
var parser = new StreamingMultipartFormDataParser(stream);
parser.ParameterHandler += parameter => DoSomethingWithParameter(parameter);
parser.FileHandler += (name, fileName, type, disposition, buffer, bytes, partNumber, additionalProperties) =>
{
// Write the part of the file we've received to a file stream. (Or do something else)
filestream.Write(buffer, 0, bytes);
}
// You can parse synchronously:
parser.Run();
// Or you can parse asynchronously:
await parser.RunAsync().ConfigureAwait(false);
Multiple Parameters
// stream:
-----------------------------41952539122868
Content-Disposition: form-data; name="checkbox"
likes_cake
-----------------------------41952539122868
Content-Disposition: form-data; name="checkbox"
likes_cookies
-----------------------------41952539122868--
// ===== Simple Parsing ====
// You can parse synchronously:
var parser = MultipartFormDataParser.Parse(stream);
// Or you can parse asynchronously:
var parser = await MultipartFormDataParser.ParseAsync(stream).ConfigureAwait(false);
// From this point the data is parsed, we can retrieve the
// form data from the GetParameterValues method
var checkboxResponses = parser.GetParameterValues("checkbox");
foreach(var parameter in checkboxResponses)
{
Console.WriteLine("Parameter {0} is {1}", parameter.Name, parameter.Data)
}
Multiple Files
// stream:
-----------------------------41111539122868
Content-Disposition: form-data; name="files[]"; filename="photo1.jpg"
Content-Type: image/jpeg
MoreBinaryData
-----------------------------41111539122868
Content-Disposition: form-data; name="files[]"; filename="photo2.jpg"
Content-Type: image/jpeg
ImagineLotsOfBinaryData
-----------------------------41111539122868--
// ===== Simple Parsing ====
// You can parse synchronously:
var parser = MultipartFormDataParser.Parse(stream);
// Or you can parse asynchronously:
var parser = await MultipartFormDataParser.ParseAsync(stream).ConfigureAwait(false);
// Loop through all the files
foreach(var file in parser.Files)
{
Stream data = file.Data;
// Do stuff with the data.
}
// ==== Advanced Parsing ====
var parser = new StreamingMultipartFormDataParser(stream);
parser.ParameterHandler += parameter => DoSomethingWithParameter(parameter);
parser.FileHandler += (name, fileName, type, disposition, buffer, bytes, partNumber, additionalProperties) =>
{
// Write the part of the file we've received to a file stream. (Or do something else)
// Assume that filesreamsByName is a Dictionary<string, FileStream> of all the files
// we are writing.
filestreamsByName[name].Write(buffer, 0, bytes);
};
parser.StreamClosedHandler += ()
{
// Do things when my input stream is closed
};
// You can parse synchronously:
parser.Run();
// Or you can parse asynchronously:
await parser.RunAsync().ConfigureAwait(false);
Licensing
This project is licensed under MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. 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 is compatible. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| .NET Framework | net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
- System.Buffers (>= 4.5.1)
-
.NETStandard 2.1
- Microsoft.CSharp (>= 4.7.0)
- Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
- System.Buffers (>= 4.5.1)
-
net6.0
- Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
- System.Buffers (>= 4.5.1)
-
net7.0
- Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
- System.Buffers (>= 4.5.1)
NuGet packages (45)
Showing the top 5 NuGet packages that depend on HttpMultipartParser:
| Package | Downloads |
|---|---|
|
StrongGrid
StrongGrid is a strongly typed .NET client for SendGrid's v3 API. |
|
|
ZoomNet
ZoomNet is a strongly typed .NET client for Zoom's API. |
|
|
Pangea.SDK
.NET SDK to access Pangea API services on pangea.cloud |
|
|
IctBaden.Stonehenge3
X-Platform Web Application Framework |
|
|
IctBaden.Stonehenge4
X-Platform Web MVVM Application Framework |
GitHub repositories (10)
Showing the top 10 popular GitHub repositories that depend on HttpMultipartParser:
| Repository | Stars |
|---|---|
|
restsharp/RestSharp
Simple REST and HTTP API Client for .NET
|
|
|
sendgrid/sendgrid-csharp
The Official Twilio SendGrid C#, .NetStandard, .NetCore API Library
|
|
|
Decimation/SmartImage
Reverse image search tool (SauceNao, IQDB, Ascii2D, trace.moe, and more)
|
|
|
uholeschak/ediabaslib
.NET BMW and VAG Ediabas interpreter library
|
|
|
bassmaster187/TeslaLogger
TeslaLogger is a self hosted data logger for your Tesla Model S/3/X/Y. Actually it supports RaspberryPi 3B, 3B+, 4B, Docker and Synology NAS.
|
|
|
DataDog/dd-trace-dotnet
.NET Client Library for Datadog APM
|
|
|
Jericho/StrongGrid
Strongly typed library for the entire SendGrid v3 API, including webhooks
|
|
|
daohainam/mini-web-server
A simple but full-featured web server, supports HTTP/1, HTTP/2, MVC, API, Authentication, Authorization...
|
|
|
yahehe/Nancy.Swagger
Nancy plugin for generated API documentation in Swagger format.
|
|
|
scottoffen/grapevine
Fast, unopinionated, embeddable, minimalist web framework for .NET
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.0 | 79,100 | 3/2/2026 |
| 9.2.0 | 216,284 | 11/13/2025 |
| 9.1.0 | 199,907 | 9/1/2025 |
| 9.0.0 | 1,195,098 | 1/29/2025 |
| 8.4.0 | 2,430,319 | 4/8/2024 |
| 8.3.0 | 913,272 | 1/10/2024 |
| 8.2.0 | 766,482 | 6/22/2023 |
| 8.1.0 | 571,746 | 2/5/2023 |
| 8.0.0 | 397,015 | 1/8/2023 |
| 7.1.0 | 354,038 | 10/30/2022 |
| 7.0.0 | 340,753 | 7/7/2022 |
| 6.0.1 | 79,316 | 5/31/2022 |
| 5.1.0 | 1,317,734 | 3/5/2022 |
| 5.0.1 | 4,981,880 | 7/11/2021 |
| 5.0.0 | 2,031,732 | 1/3/2021 |
| 4.4.0 | 99,356 | 12/4/2020 |
| 4.3.1 | 720,556 | 5/1/2020 |
| 4.3.0 | 3,316 | 5/1/2020 |
| 4.2.0 | 77,527 | 3/30/2020 |
| 4.1.0 | 6,470 | 3/22/2020 |