web-dev-qa-db-ja.com

.net core 2.1Postmanを使用してIFormFileを「POST」-アプリケーションはリクエスト本文全体を読み取らずに完了しました

Dotnet core WebAPI 2.1に取り組んでいますが、Bodyに画像を送信する方法が見つかりません。

コントローラは次のようになります。

    [HttpPost("api/image")]
    public IActionResult Post([FromBody]IFormFile file)
    {
        var filePath = Path.GetTempFileName();
        if (file.Length > 0)
        {
            return Ok();
        }
        return BadRequest();
    }

そして、これは私の郵便配達員の呼び出しです: enter image description here

Kestrelが失敗しているため、この呼び出しは終了しません enter image description here

私はすでにConsumesを使おうとしました

[Consumes("application/json", "application/json-patch+json", "multipart/from-data")]

また、郵便配達員では、Content-Typeをmultipart/form-dataに設定しました

4
rm -rf .

このようにしてみてください。現在使用している郵便配達員で同じリクエストを使用します。これは単なる大まかな定型法ですが、あなたはその考えを理解します。

また、postmanのリクエストのヘッダーを次のように設定することを忘れないでください:Content-Type:multipart/form-data

[HttpPost]
[Route("api/image")]
public async Task<IHttpActionResult> InsertNewMerchant()
{
        // your form data is here
             var formData = HttpContext.Current.Request.Form;
             HttpFileCollection files = HttpContext.Current.Request.Files;


            if (files.Count == 1)
            {
            // this is the file you need 
                var image = files[0];
                    // do something with the file
            }
    return StatusCode(System.Net.HttpStatusCode.Created);
}
4
Bola

.Net Core 2.1/2.2のソリューションを見つけました ここ

POSTMANから複数のファイルをPOST

POSTMANからのPOST単一ファイル

    [HttpPost]
    public async Task<IActionResult> UploadSingleFile([FromForm(Name = "file")] IFormFile file)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);
        var IDsList = new IDsList();

        try
        {
            var id = SaveFile(file);
            IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }

        return Content(JsonConvert.SerializeObject(IDsList), "application/json");
    }

    [HttpPost("UploadFiles")]
    public async Task<IActionResult> UploadFiles([FromForm(Name = "files")] ICollection<IFormFile> files)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        //var files = Request.Form.Files?.GetFiles("files");
        String message = String.Empty;
        int filesCounter = 0;
        var IDsList = new IDsList();

        foreach (var file in files)
        {
            if (file.Length == 0)
                message = message + $"errorDescription {file.FileName}\n";

            try
            {
                var id = SaveFile(file);
                IDsList.Files.Add(new IDsList.FileInfo() { id = id, fileName = file.FileName });
                filesCounter++;
            }
            catch(Exception ex)
            {
                message = $"{message}{ex.Message}\n";
            }
        }

        IDsList.message = $"Amount: {filesCounter}.\n{message}";

        return Content(JsonConvert.SerializeObject(IDsList), "application/json");
    }
3

試してみましたが、うまくいきました。多分あなたは何かをするのを忘れます。 [FromBody]属性を削除します。

    [HttpPost("api/image")]
    public IActionResult Post(IFormFile file)
    {
        var filePath = Path.GetTempFileName();
        if (file.Length > 0)
        {
            return Ok();
        }
        return BadRequest();
    }

Postmanは自動的に正しいContent-Typeを添付し、本文セクションでform-dataオプションを選択し、fileキーを使用してファイルを追加します。

動作するはずです。

1
Celal Yildirim

Postman macOS applicationにエラーの問題があるようです。 postman chrome extensionを使用している場合、すべてが期待どおりに機能します。

MacOSアプリMacOS app

Chrome拡張機能enter image description here

1
rm -rf .

これが回答されたことは知っていますが、回避策を決定したようです。エンドポイントにもPostmanリクエストにも問題はありません。同じ問題が発生し、OSにネイティブPostmanをインストールすると、問題が解決しました https://www.getpostman.com/apps

0
mariovalens