2010-10-07 5 views
7

Próbuję napisać parser wieloczęściowy, ale rzeczy się komplikują i chcę zapytać, czy ktoś wie o gotowym parserze w C#!Czy istnieje parser wieloczęściowy/formularz danych w C# - (NO ASP)

Dla jasności piszę własny "malutki" serwer http i muszę wstawiać wieloczęściowe dane formularzy!

Dzięki z góry, Gohlool

+0

Co chcesz analizować? – Nayan

+0

Cóż, parsuję wieloczęściowy/formularzowy strumień danych otrzymany z przeglądarki, przesyłając plik i niektóre pola! – Gohlool

+0

Tak, istnieje: http://stackoverflow.com/questions/7460088/reading-file-input-from-a-multipart-form-data-post/21689347#21689347 (mimo że ma ASP.NET w nazwie możesz go używać w dowolnym miejscu, w szczególności nie musisz być uruchomiony pod ASP.NET) –

Odpowiedz

23

otwierania-pochodzą C# postać HTTP parser here.

Jest to nieco bardziej elastyczny niż inny wymieniony, który jest na CodePlex, ponieważ można go używać zarówno dla Multipart i non-Multipart form-data, a także daje inne parametry formularza sformatowane w obiekcie Dictionary.

ten może być stosowany w sposób następujący:

non-wieloczęściowy

public void Login(Stream stream) 
{ 
    string username = null; 
    string password = null; 

    HttpContentParser parser = new HttpContentParser(stream); 
    if (parser.Success) 
    { 
     username = HttpUtility.UrlDecode(parser.Parameters["username"]); 
     password = HttpUtility.UrlDecode(parser.Parameters["password"]); 
    } 
} 

wieloczęściowy

public void Upload(Stream stream) 
{ 
    HttpMultipartParser parser = new HttpMultipartParser(stream, "image"); 

    if (parser.Success) 
    { 
     string user = HttpUtility.UrlDecode(parser.Parameters["user"]); 
     string title = HttpUtility.UrlDecode(parser.Parameters["title"]); 

     // Save the file somewhere 
     File.WriteAllBytes(FILE_PATH + title + FILE_EXT, parser.FileContents); 
    } 
} 
+0

Dziękuję za odpowiedź! Spróbuję to sprawdzić i mam nadzieję, że będzie to również wsparcie dla formatu wielostronicowego/mieszanego! – Gohlool

+1

@Gohlool tak, HttpMultipartParser obsługuje wieloczęściowe dane formularzy utworzone z dowolnej liczby części tekstu i części pliku. Nazwa części zawierającej plik musi zostać przekazana jako drugi argument w konstruktorze, a plik może być dowolnym typem MIME. –

+0

Dziękuję bardzo Lorenzo! – Gohlool

6

miałem pewne problemy z parsera, które są oparte na ciąg parsowanie szczególnie w przypadku dużych plików Znalazłem, że zabraknie mu pamięci i nie przetworzy binarnego dat za.

Aby poradzić sobie z tymi problemami mam otwarte pozyskiwane własną próbę parsera C# wieloczęściowy/form-data here

zobaczyć moją odpowiedź here aby uzyskać więcej informacji.

1

Sprawdź nowy MultipartStreamProvider i jego podklasy (np. MultipartFormDataStreamProvider). Możesz także utworzyć własną implementację, jeśli żadna z wbudowanych implementacji nie jest odpowiednia do użycia.

0

Z Core teraz masz dostęp do kolekcji IForm przy użyciu HttpContext.Request.Form.

Przykład zapisywania obrazu:

 Microsoft.AspNetCore.Http.IFormCollection form; 
     form = ControllerContext.HttpContext.Request.Form; 

     using (var fileStream = System.IO.File.Create(strFile)) 
     { 
      form.Files[0].OpenReadStream().Seek(0, System.IO.SeekOrigin.Begin); 
      form.Files[0].OpenReadStream().CopyTo(fileStream); 
     }