HttpClientでファイルをアップロードする.ネット6


問題


私は最近、サードパーティの“ドキュメントマネージャ”システムを使用してファイルを送信する方法を把握する必要がありましたHttpClient イン.NET 6.0 . この「ドキュメントマネージャ」システムは既にファイルをアップロードするためのAPIを持っていました.
我々が飛び込む前に、我々の要件/使用ケースについて注意する2つの面白いものがあります
  • 私がアップロードするために必要なファイルは、最初に我々のシステムにアップロードされていました
  • 私たちがドキュメントマネージャにアップロードした各ファイルは、オリジナルファイルについて必要なメタデータを含む2番目のファイルを必要としました.
  • Postmanでは、さまざまな言語やフレームワークで、特定のリクエストが生成されるコードを表示できます.しかし、現在ではCRestSharp , そして、我々は自然にすべてをしていますHttpClient . それは私に少なくとも出発点を与えましたRestSharp それをすることができました-それは可能でなければなりませんか?
    で掘り出した後RestSharp ソースと非常に類似した何かをしていたカップルの他のブログを見つけるhttps://makolyte.com/csharp-how-to-send-a-file-with-httpclient ), 私は解決策をまとめることができました.幸運にも、私たちはすでにIFormFile 私たちのコントローラのアクションには、サードパーティのドキュメントマネージャにファイルを“転送”にはかなり簡単に終わった.

    解決策


    まず、ファイルをアップロードするHttpClient , リクエストに必要なコンテンツを作成する必要があります.この場合、私たちはMultipartFormDataContent ( System.Net.Http ), 加えるStreamContent , フォームの内容を追加します.
    public async Task<IActionResult> Upload(IFormFile file) 
    {
        var content = new MultipartFormDataContent();
    
        var fileContent = new StreamContent(file.OpenReadStream());
        fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
    
        content.Add(fileContent, "file", file.FileName);
    }
    
    以来、私たちはIFormFile すでに、我々はHTTPリクエストのために必要な必要なコンテンツを作成するためにすべてのプロパティをオフにすることができます.
    これはうまく動作していましたが、私は、メタデータを記述するJSONフォーマット(JSON形式で)と一緒に行くために別のファイルを必要とすることを覚えています.幸いにも、我々はすでにこの特定のアップロード・ページからメタデータを演繹することができます.
    適切なJSONをメモリに持つ点から始めましょう.
    {
        "key": "newFile",
        "metadata": [
            {
                "name": "uploaded-by",
                "value": "user123"
            },
            {
                "name": "document-type",
                "value": "work-order"
            }
        ]
    }
    
    さて、そのJSONを念頭に置いて、文字列変数に代入して、このセカンダリペイロードを作成しましょう(コードの最初のブロックに追加).
    public async Task<IActionResult> Upload(IFormFile file) 
    {
        var content = new MultipartFormDataContent();
    
        var fileContent = new StreamContent(file.OpenReadStream());
        fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
    
        content.Add(fileContent, "file", file.FileName);
    
        var jsonPayload = "that payload from the above sample";
        var jsonBytes = Encoding.UTF8.GetBytes(jsonPayload);
        var jsonContent = new StreamContent(new MemoryStream(jsonBytes));
        jsonContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
    
        content.Add(jsonContent, "metadata", "metadata.json");
    }
    
    文字列の使用に注意してください."file" and "metadata" サードパーティAPIは、要求を行うときにファイルを呼び出す必要があるプロパティ名です.それらは理論的には何かであるかもしれません、しかし、どんな適切なAPIドキュメンテーションもあなたに話すべきです.それぞれの“ファイル”は“ファイル名”を必要とするfile.FileName ハードコードのプロパティ"metadata.json" 二次ファイルについては、実際の名前を持っていないので、私たちが呼んでいるAPIに多少関係がありません.
    この時点で、あなたのことができますPOST APIへのリクエストcontent !
    public async Task<IActionResult> Upload(IFormFile file, CancellationToken cancellationToken) 
    {
        var content = new MultipartFormDataContent();
    
        var fileContent = new StreamContent(file.OpenReadStream());
        fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
    
        content.Add(fileContent, "file", file.FileName);
    
        var jsonPayload = "that payload from the above sample";
        var jsonBytes = Encoding.UTF8.GetBytes(jsonPayload);
        var jsonContent = new StreamContent(new MemoryStream(jsonBytes));
        jsonContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
    
        content.Add(jsonContent, "metadata", "metadata.json");
    
        var response = await _httpClient.PostAsync("The API URI", content, cancellationToken);
    
        return Ok();
    }
    
    もちろん、あなたは“何か”をしたいと思うでしょうresponse あなたの要求が成功したことを確認するために、おそらくユーザーにも知っている😊.

    概要


    そして、友人、どのようにサードパーティ製のAPIに2つのファイルをアップロードする方法ですHttpClient , それらのファイルのうちの1つがあなたのウェブアプリケーションのユーザーによってアップロードされているとき、そして、もう一方は必要に応じてメモリでつくられることができます(少なくとも).
    上のコードのサンプルは「かなり」生産準備完了ですbe sure to utilize HttpClient properly そして心をusing それらの使い捨て物に関する声明!
    私は、これが誰かを助けることを望みます.ない場合は、私に知らせてください、私はそれに応じてポストを調整します!