如何编写将接受文件的API操作方法?

问题描述 投票:0回答:1

我正在尝试编写一个API端点,该端点将允许用户使用Asp.NET Core 3.1将文件发送到我的服务器。

我有以下操作方法,需要响应客户端的请求并处理文件验证并存储文件。

[HttpPost, Route("api/store")]
public async Task<IActionResult> Store([FromBody] MultipartFormDataContent content)
{
    // Validate the file, store it.

    return Ok();
}

我正在尝试像这样从客户端发送文件

using HttpClient client = new HttpClient();

var multiForm = new MultipartFormDataContent();
multiForm.Add(new StringContent("1/12/1.jpg"), "custom_file_name");
FileStream fs = System.IO.File.OpenRead("1.jpg");
multiForm.Add(new StreamContent(fs), "file");

// send request to API
var url = "https://localhost:123/api/store";
var response = await client.PostAsync(url, multiForm);

但是服务器返回HTTP Code 404 Not Found

如何正确调整上面的Store方法,以便它接受客户端发送的文件?

c# asp.net-core asp.net-core-2.0 asp.net-core-3.0 asp.net-apicontroller
1个回答
1
投票

您不应在操作方法路径中包含api/。控制器的路径已经以api为前缀。另外,api/[controller]表示控制器路由为api/ControllerName,那么您的动作将为api/ControllerName/store

如果您的控制器类名为ThingsController,则其路由为api/things,并且您的Store操作应为api/things/store

您无需在动作上同时使用HttpPostRoute属性。 Route属性接受所有HTTP动词,因此使用一个或另一个(通常只使用HttpPost或您将使用action方法处理的任何HTTP动词。所以:

[ApiController]
[Route("api/[controller]")]
public class ThingsController : ControllerBase
{
    // POST api/things/store
    [HttpPost("store")]
    public async Task<IActionResult> Store([FromBody] MultipartFormDataContent content)
    {
        // Do stuff
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.