質問

私はちょうどマルチパートパーサーを書こうとしていますが、物事は複雑になり、誰かがC#の準備が整ったパーサーを知っているかどうかを尋ねたいです!

明確にするために、私は自分の「小さな」HTTPサーバーを書いています。

事前に、Gohlool

役に立ちましたか?

解決

C#HTTPフォームパーサーをオープンソースしました ここ.

これは、MultiPartとNon-Multipartの両方に使用できるため、CodePlexにある他のものよりもわずかに柔軟です form-data, また、フォーマットされた他のフォームパラメーターを提供します Dictionary 物体。

これは次のように使用できます。

非マルチパート

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"]);
    }
}

マルチパート

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);
    }
}

他のヒント

特に大きなファイルを使用した文字列解析に基づいたパーサーにいくつかの問題がありました。メモリがなくなり、バイナリデータを解析できないことがわかりました。

これらの問題に対処するために、私はC#MultiPart/Form-Dataパーサーでの私自身の試みを開きました ここ

私の答えを見てください ここ 詳細については。

新しいMultiPartStreamProviderとそのサブクラス(IE MultiPartFormDataStreamProvider)をご覧ください。組み込みの実装のいずれもユースケースに適していない場合、独自の実装も作成できます。

Coreを使用すると、httpcontext.request.formを使用してIformCollectionにアクセスできます。

画像の保存の例:

        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);
        }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top