При работе в C# с различными протоколами, позволяющими передавать бинарные данные по Сети, часто возникает необходимость обрабатывать т.н. составное содержимое. Чаще всего, при работе с HTTP бинарные данные отправляются на сервер методом POST и используется Mime-тип multipart/form-data. В этой заметке рассмотрен один из возможных вариантов чтения (парсинга) multipart/form-data в C#.
Для чтения multipart/form-data в C# мы воспользуемся пакетом HTTPMultipartParser. Установить пакет в Visual Studio можно с помощью менеджера пакетов NuGet:

Чтобы воспользоваться парсером, необходимо подключить в проекте одноименное пространство имен:
using HttpMultipartParser;
Это пространство имен содержит класс MultipartFormDataParser
в котором определены четыре статических метода для чтения данных:
public static MultipartFormDataParser Parse(Stream stream, Encoding encoding, int binaryBufferSize = 4096, string[] binaryMimeTypes = null); public static MultipartFormDataParser Parse(Stream stream, string boundary = null, Encoding encoding = null, int binaryBufferSize = 4096, string[] binaryMimeTypes = null); public static Task<MultipartFormDataParser> ParseAsync(Stream stream, Encoding encoding, int binaryBufferSize = 4096, string[] binaryMimeTypes = null); public static Task<MultipartFormDataParser> ParseAsync(Stream stream, string boundary = null, Encoding encoding = null, int binaryBufferSize = 4096, string[] binaryMimeTypes = null);
Все методы в качестве входных параметров получают, как минимум, один параметр — поток данных multipart/form-data.
Чтобы прочитать из потока всю информацию о переданных файлах, можно воспользоваться, например, следующим кодом:
MultipartFormDataParser multipartParser = MultipartFormDataParser.Parse(request.InputStream); foreach (FilePart fileInfo in multipartParser.Files) { MemoryStream memory = new MemoryStream(); fileInfo.Data.CopyTo(memory); File.WriteAllBytes(fileInfo.FileName, memory.ToArray()); }
В результате, все файлы, переданные с помощью multipart/form-data, будут сохранены на диске. Учитывая, что клиент может не передать в данных формы имя файла, то, конечно, в коде выше стоит также предусмотреть и такой вариант, когда путь к файлу на диске указывается с каким-либо значением по умолчанию. Но, в целом, представленный выше код позволяет понять суть и, главное, простоту чтения multipart/form-data в C#.