Как прочитать multipart/form-data в C#

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

Для чтения multipart/form-data в C# мы воспользуемся пакетом HTTPMultipartParser. Установить пакет в Visual Studio можно с помощью менеджера пакетов NuGet:

multipart/form-data parser
multipart/form-data parser

Чтобы воспользоваться парсером, необходимо подключить в проекте одноименное пространство имен:

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#.

Подписаться
Уведомить о
guest
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии