正如您已经注意到的那样,binary file
在 Postman/Insomnia 中使用选项不是标准方式。通过 RESTful API 上传文件有三种不同的方式,您必须选择一种。
我已经包含了将上传的文件内容读取到字符串并输出的代码片段——尝试发送一个文本文件,你应该在 200 响应中获得文件的内容。
表单数据上传
这是最流行/众所周知的上传方法,将您发送的数据格式化为一组键/值对。您通常需要在请求中指定Content-Type
to multipart/form-data
,然后[FromForm]
在 MVC 中使用属性将值绑定到变量。此外,您可以使用内置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 将值绑定到代码中的变量。因此,要访问该文件,您需要读取Body
.Request
[HttpPost]
public async Task<IActionResult> PostBinary()
{
using (var sr = new StreamReader(Request.Body))
{
var body = await sr.ReadToEndAsync();
return Ok(body);
}
}
注意:示例读Body
作string
. 您可能希望在您的应用程序中使用Stream
或byte[]
来避免文件数据编码问题。