gpt4 book ai didi

c# - ASPNetCore - 通过 REST 上传文件

转载 作者:行者123 更新时间:2023-12-03 02:00:30 24 4
gpt4 key购买 nike

我正在使用 Insomnia 来测试 API,但 Postman 也会发生同样的情况。

我想使用以下 Controller 测试文件上传:

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

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

enter image description here

它有效。

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

enter image description here

我不知道如何获取数据。怎么办?

此外,在 Controller 方法的签名中,如果我将 [FromForm] 更改为 [FromBody],我将无法获取数据。

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

最佳答案

正如您已经注意到的,在 Postman/Insomnia 中使用二进制文件选项并不能以标准方式工作。通过 RESTful API 上传文件的方式有三种,您必须选择一种。

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

表单数据上传

这是最流行/众所周知的上传方法,将您发送的数据格式化为一组键/值对。通常需要在请求中指定Content-Typemultipart/form-data,然后使用MVC中的[FromForm]属性进行绑定(bind)变量的值。此外,您还可以使用内置的 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"
}

然后在 Controller 中指定[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 将值绑定(bind)到代码中的变量。因此,要访问该文件,需要读取Request中的Body

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

注意:该示例将 Body 读取为 string。您可能希望在应用程序中使用 Streambyte[] 以避免文件数据编码问题。

关于c# - ASPNetCore - 通过 REST 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50223606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com