如何通过ASP.NET Core实现RESTful API上传文件的功能?

2026-03-30 12:131阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计626个文字,预计阅读时间需要3分钟。

如何通过ASP.NET Core实现RESTful API上传文件的功能?

我正在使用Insomnia测试API,但Postman也是如此。我想使用以下控制器测试文件上传:csharppublic async Task Post([FromForm] IFormFile File)如果我将请求设置为多部分请求,有用。但问题是,如果我将它设置为其它的,会如何呢?

我正在使用Insomnia来测试API,但Postman也是如此.

我想用以下控制器测试文件上传:

public async Task<IActionResult> Post([FromForm]IFormFile File)

如果我将请求设置为多部分请求:

有用.

但是,如果我将其设置为二进制文件:

如何通过ASP.NET Core实现RESTful API上传文件的功能?

我不知道如何获取数据.怎么做到呢?

另外,在控制器方法的签名中,如果我将[FromForm]更改为[FromBody],我就不会获取数据.

有人可以为我澄清一下吗?

正如您已经注意到的那样,在Postman / Insomnia中使用二进制文件选项并不是标准方式.通过RESTful API上传文件有三种不同的方法,您必须选择一种方法.

我已经包含了将上传的文件内容读取到字符串并输出的代码片段 – 尝试发送文本文件,您应该在200响应中获取该文件的内容.

表单数据上传

这是最常用/众所周知的上传方法,将您发送的数据格式化为一组键/值对.您通常需要在请求中将Content-Type指定为multipart / form-data,然后使用MVC中的[FromForm]属性将值绑定到变量.此外,您可以使用内置的IFormFile类来访问上传的文件.

[HttpPost] public async Task<IActionResult> PostFormData([FromForm] IFormFile file) { using (var sr = new StreamReader(file.OpenReadStream())) { var content = await sr.ReadToEndAsync(); return Ok(content); } }

正文上传

您可以以MVC理解的格式发送正文,例如JSON,并将文件嵌入其中.通常,文件内容将使用Base64或其他编码进行编码,以防止出现字符编码/解码问题,尤其是在发送图像或二进制数据时.例如.

{ "file": "MTIz" }

然后在控制器中指定[FromBody],并使用类进行模型反序列化.

[HttpPost] public IActionResult PostBody([FromBody] UploadModel uploadModel) { var bytes = Convert.FromBase64String(uploadModel.File); var decodedString = Encoding.UTF8.GetString(bytes); return Ok(decodedString); } // ... public class UploadModel { public string File { get; set; } }

使用大型和非文本文件时,JSON请求变得笨拙且难以阅读.

二进制文件

这里的关键是你的文件是整个请求.该请求不包含任何其他信息,以帮助MVC将值绑定到代码中的变量.因此,要访问该文件,您需要在Request中读取Body.

[HttpPost] public async Task<IActionResult> PostBinary() { using (var sr = new StreamReader(Request.Body)) { var body = await sr.ReadToEndAsync(); return Ok(body); } }

本文共计626个文字,预计阅读时间需要3分钟。

如何通过ASP.NET Core实现RESTful API上传文件的功能?

我正在使用Insomnia测试API,但Postman也是如此。我想使用以下控制器测试文件上传:csharppublic async Task Post([FromForm] IFormFile File)如果我将请求设置为多部分请求,有用。但问题是,如果我将它设置为其它的,会如何呢?

我正在使用Insomnia来测试API,但Postman也是如此.

我想用以下控制器测试文件上传:

public async Task<IActionResult> Post([FromForm]IFormFile File)

如果我将请求设置为多部分请求:

有用.

但是,如果我将其设置为二进制文件:

如何通过ASP.NET Core实现RESTful API上传文件的功能?

我不知道如何获取数据.怎么做到呢?

另外,在控制器方法的签名中,如果我将[FromForm]更改为[FromBody],我就不会获取数据.

有人可以为我澄清一下吗?

正如您已经注意到的那样,在Postman / Insomnia中使用二进制文件选项并不是标准方式.通过RESTful API上传文件有三种不同的方法,您必须选择一种方法.

我已经包含了将上传的文件内容读取到字符串并输出的代码片段 – 尝试发送文本文件,您应该在200响应中获取该文件的内容.

表单数据上传

这是最常用/众所周知的上传方法,将您发送的数据格式化为一组键/值对.您通常需要在请求中将Content-Type指定为multipart / form-data,然后使用MVC中的[FromForm]属性将值绑定到变量.此外,您可以使用内置的IFormFile类来访问上传的文件.

[HttpPost] public async Task<IActionResult> PostFormData([FromForm] IFormFile file) { using (var sr = new StreamReader(file.OpenReadStream())) { var content = await sr.ReadToEndAsync(); return Ok(content); } }

正文上传

您可以以MVC理解的格式发送正文,例如JSON,并将文件嵌入其中.通常,文件内容将使用Base64或其他编码进行编码,以防止出现字符编码/解码问题,尤其是在发送图像或二进制数据时.例如.

{ "file": "MTIz" }

然后在控制器中指定[FromBody],并使用类进行模型反序列化.

[HttpPost] public IActionResult PostBody([FromBody] UploadModel uploadModel) { var bytes = Convert.FromBase64String(uploadModel.File); var decodedString = Encoding.UTF8.GetString(bytes); return Ok(decodedString); } // ... public class UploadModel { public string File { get; set; } }

使用大型和非文本文件时,JSON请求变得笨拙且难以阅读.

二进制文件

这里的关键是你的文件是整个请求.该请求不包含任何其他信息,以帮助MVC将值绑定到代码中的变量.因此,要访问该文件,您需要在Request中读取Body.

[HttpPost] public async Task<IActionResult> PostBinary() { using (var sr = new StreamReader(Request.Body)) { var body = await sr.ReadToEndAsync(); return Ok(body); } }